{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.728545Z",
     "start_time": "2021-04-03T17:54:18.435113Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torchvision \n",
    "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n",
    "from torchvision import transforms\n",
    "\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "\n",
    "from tqdm.autonotebook import tqdm\n",
    "\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.pyplot import imshow\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "import time\n",
    "\n",
    "from idlmam import train_network, Flatten, weight_reset, View, set_seed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.734725Z",
     "start_time": "2021-04-03T17:54:19.730121Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from IPython.display import set_matplotlib_formats\n",
    "set_matplotlib_formats('png', 'pdf')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.749153Z",
     "start_time": "2021-04-03T17:54:19.735879Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "torch.backends.cudnn.deterministic=True\n",
    "set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.782882Z",
     "start_time": "2021-04-03T17:54:19.750977Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.809218Z",
     "start_time": "2021-04-03T17:54:19.784393Z"
    }
   },
   "outputs": [],
   "source": [
    "mnist_train = torchvision.datasets.MNIST(\"./\", train=True, transform=transforms.ToTensor(), download=True)\n",
    "mnist_test = torchvision.datasets.MNIST(\"./\", train=False, transform=transforms.ToTensor(), download=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.815705Z",
     "start_time": "2021-04-03T17:54:19.811377Z"
    }
   },
   "outputs": [],
   "source": [
    "class LargestDigit(Dataset):\n",
    "    \"\"\"\n",
    "    Creates a modified version of a dataset where some number of samples are taken, \n",
    "    and the true label is the largest label sampled. When used with MNIST the labels \n",
    "    correspond to their values (e.g., digit \"6\" has label 6)\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, dataset, toSample=3):\n",
    "        \"\"\"\n",
    "        dataset: the dataset to sample from\n",
    "        toSample: the number of items from the dataset to sample\n",
    "        \"\"\"\n",
    "        self.dataset = dataset\n",
    "        self.toSample = toSample\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.dataset)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        #Randomly select n=self.toSample items from the dataset\n",
    "        selected = np.random.randint(0,len(self.dataset), size=self.toSample)\n",
    "        \n",
    "        #Stack the n items of shape (B, *) shape into (B, n, *)\n",
    "        x_new = torch.stack([self.dataset[i][0] for i in selected])\n",
    "        #Label is the maximum label\n",
    "        y_new = max([self.dataset[i][1] for i in selected])\n",
    "        #Return (data, label) pair!\n",
    "        return x_new, y_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.821596Z",
     "start_time": "2021-04-03T17:54:19.817125Z"
    }
   },
   "outputs": [],
   "source": [
    "B = 128\n",
    "epochs = 10\n",
    "\n",
    "largest_train = LargestDigit(mnist_train)\n",
    "largest_test = LargestDigit(mnist_test)\n",
    "\n",
    "train_loader = DataLoader(largest_train, batch_size=B, shuffle=True)\n",
    "test_loader = DataLoader(largest_test, batch_size=B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:19.826405Z",
     "start_time": "2021-04-03T17:54:19.822802Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "#Want a consistent dataset split\n",
    "set_seed(34)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T17:54:20.218399Z",
     "start_time": "2021-04-03T17:54:19.827572Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True Label is =  8\n"
     ]
    },
    {
     "data": {
      "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1BhZ2VzIDIgMCBSIC9UeXBlIC9DYXRhbG9nID4+CmVuZG9iago4IDAgb2JqCjw8IC9FeHRHU3RhdGUgNCAwIFIgL0ZvbnQgMyAwIFIgL1BhdHRlcm4gNSAwIFIKL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL1NoYWRpbmcgNiAwIFIKL1hPYmplY3QgNyAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9Bbm5vdHMgWyBdIC9Db250ZW50cyA5IDAgUgovR3JvdXAgPDwgL0NTIC9EZXZpY2VSR0IgL1MgL1RyYW5zcGFyZW5jeSAvVHlwZSAvR3JvdXAgPj4KL01lZGlhQm94IFsgMCAwIDU5Mi4xMTg3NSAxOTYuMDU1NzI0Nzg5OSBdIC9QYXJlbnQgMiAwIFIgL1Jlc291cmNlcyA4IDAgUgovVHlwZSAvUGFnZSA+PgplbmRvYmoKOSAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDExIDAgUiA+PgpzdHJlYW0KeJy1lsFu3DYQhu98Ch7bC3eGHHLIY4ykRnNzu0AfwHXSGt4EboD69TuUk9WQFsW1gR4MrwYUP3FIfb/Q3pvDO7Sfv1mw9/L3ZNFe28P7u3//vr377frK3n4zIPWTicU7xMxRrh7UFZbkIEb2UcrQXv5lzBcjs8st1zLxZ2N8cmW5zQeXefl1MljQQUihsCo/6LJUXMklei/18xxNVVifzKPdAGAieVZOxBBz7i//ubN/2C/28M7XLqB0AaULYPouPMqNde2w/N/A3J7s4Ve077/aG3NjH3/MCLL8Oiu4XOeVRkjF+OIyFZIn141QVXDhRx/MlfTwyVwd7eEXtAj2+Kn2IKXCgTjlYovznFFafvzT/AQ/2+O9/XA0C9Hk7Cj5nHJDUtUJKctGQ6DipWHYkrBDIbEDTgFDu72qPIEhgWNMJWTw0bc039HUMYiubuXSweCoKw5IwcVYwjISnU9YmDiXstXClRSj4+jRc4Naq1NWRFdilLUhQF5YccSSX0SRgBrWWt1msfMyyLtEOfpC8o5ubtUZU9hhkHPgNWUtjiEluCCjIbGXhS+M0VISuxywxKIZa3HMkDcVQoRMEELaPwQhu9pWGaYYa3HMCOTY55AwSF+fGed1ePvx2YvLu9v6YNNk22oyv28r7jRUnNzxGlPq4Wqe3fnP2v9onw39pCxdJ49F3vmGHuoUzJGpoaty6+l1lpemroZcB4iL01uNbb4b+0VudcYewRZv+0u9LX3mAjJPu++qPDO33JcQCqIPJe6q24vD5E0HohamyjMYFyfjJCpq//btLeffATLldmm6PKGFwC7FjEhUYp7YWx8O5e/K6MuDtSG4CPKtgcuGXqBxhWxErpgzlffQuc8VtDG6gs6c7kHOP31/A9JFel+pjeBX6EzxHfMC26/Ixvcrcmb8DnmB/Fdko/8VOQuADvnmLNj25UiAYt9NlZ6GKq2Cf5WT2xuaTNhh7GUCSVczoHwLNvyY6UVOPahqg1BzbCfCeUA92/5/ToQhbEmEcGEikNzHAblLal2eaLM+hzgEMjMC7iYCydd4IGkatjBVnsE4St9lf6I0zu8ngihJ7JZTao+cLk9oUd6oegQLlJRoPxGaw7EmAiG70JcHawMWkSJL6tUNnSeCRupE0MxZIvTQaSJoqE4EDZ0lAoF812Uf4vPRvSARFFUngoLOEqFjzhNBIXUiKOQsETrkPBEUUieCQs4SoUO+NREGthwJUNy7JdLTSKQy/lU+bsc3cTAm3Jj/AD8UrdUKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iago5NTAKZW5kb2JqCjE5IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjQ3ID4+CnN0cmVhbQp4nE1Ru21EMQzr3xRc4ADra3meC1Jd9m9DyQiQwiChLymnJRb2xksM4QdbD77kkVVDfx4/MewzLD3J5NQ/5rnJVBS+FaqbmFAXYuH9aAS8FnQvIivKB9+PZQxzzvfgoxCXYCY0YKxvSSYX1bwzZMKJoY7DQZtUGHdNFCyuFc0zyO1WN7I6syBseCUT4sYARATZF5DNYKOMsZWQxXIeqAqSBVpg1+kbUYuCK5TWCXSi1sS6zOCr5/Z2N0Mv8uCounh9DOtLsMLopXssfK5CH8z0TDt3SSO98KYTEWYPBVKZnZGVOj1ifbdA/59lK/j7yc/z/QsVKFwqCmVuZHN0cmVhbQplbmRvYmoKMjAgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCA4MCA+PgpzdHJlYW0KeJxFjLsNwDAIRHumYAR+JmafKJWzfxsgStxwT7p7uDoSMlPeYYaHBJ4MLIZT8QaZo2A1uEZSjZ3so7BuX3WB5npTq/X3BypPdnZxPc3LGfQKZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDI0OCA+PgpzdHJlYW0KeJwtUTmSA0EIy+cVekJz0++xy5H3/+kKygGDhkMgOi1xUMZPEJYr3vLIVbTh75kYwXfBod/KdRsWORAVSNIYVE2oXbwevQd2HGYC86Q1LIMZ6wM/Ywo3enF4TMbZ7XUZNQR712tPZlAyKxdxycQFU3XYyJnDT6aMC+1czw3IuRHWZRikm5XGjIQjTSFSSKHqJqkzQZAEo6tRo40cxX7pyyOdYVUjagz7XEvb13MTzho0OxarPDmlR1ecy8nFCysH/bzNwEVUGqs8EBJwv9tD/Zzs5Dfe0rmzxfT4XnOyvDAVWPHmtRuQTbX4Ny/i+D3j6/n8A6ilWxYKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDIxMCA+PgpzdHJlYW0KeJw1UMsNQzEIu2cKFqgUAoFknla9df9rbdA7YRH/QljIlAh5qcnOKelLPjpMD7Yuv7EiC611JezKmiCeK++hmbKx0djiYHAaJl6AFjdg6GmNGjV04YKmLpVCgcUl8Jl8dXvovk8ZeGoZcnYEEUPJYAlquhZNWLQ8n5BOAeL/fsPuLeShkvPKnhv5G5zt8DuzbuEnanYi0XIVMtSzNMcYCBNFHjx5RaZw4rPWd9U0EtRmC06WAa5OP4wOAGAiXlmA7K5EOUvSjqWfb7zH9w9AAFO0CmVuZHN0cmVhbQplbmRvYmoKMTcgMCBvYmoKPDwgL0Jhc2VGb250IC9EZWphVnVTYW5zIC9DaGFyUHJvY3MgMTggMCBSCi9FbmNvZGluZyA8PCAvRGlmZmVyZW5jZXMgWyA0OCAvemVybyAvb25lIC90d28gNTMgL2ZpdmUgXSAvVHlwZSAvRW5jb2RpbmcgPj4KL0ZpcnN0Q2hhciAwIC9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnREZXNjcmlwdG9yIDE2IDAgUgovRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXSAvTGFzdENoYXIgMjU1IC9OYW1lIC9EZWphVnVTYW5zCi9TdWJ0eXBlIC9UeXBlMyAvVHlwZSAvRm9udCAvV2lkdGhzIDE1IDAgUiA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL0FzY2VudCA5MjkgL0NhcEhlaWdodCAwIC9EZXNjZW50IC0yMzYgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zIC9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAxMzQyIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxNSAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxOCAwIG9iago8PCAvZml2ZSAxOSAwIFIgL29uZSAyMCAwIFIgL3R3byAyMSAwIFIgL3plcm8gMjIgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAxNyAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0kxIDEyIDAgUiAvSTIgMTMgMCBSIC9JMyAxNCAwIFIgPj4KZW5kb2JqCjEyIDAgb2JqCjw8IC9CaXRzUGVyQ29tcG9uZW50IDggL0NvbG9yU3BhY2UgL0RldmljZVJHQgovRGVjb2RlUGFybXMgPDwgL0NvbG9ycyAzIC9Db2x1bW5zIDE2NSAvUHJlZGljdG9y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\n",
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = largest_train[0]\n",
    "\n",
    "f, axarr = plt.subplots(1,3, figsize=(10,10))\n",
    "for i in range(3):\n",
    "    axarr[i].imshow(x[i,0,:].numpy(), cmap='gray', vmin=0, vmax=1)\n",
    "print(\"True Label is = \", y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.432167Z",
     "start_time": "2021-04-03T17:54:20.219640Z"
    },
    "tags": [
     "remove_output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c5ff1c0ca9be44c28c22c1f13127c081",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "neurons = 256\n",
    "classes = 10\n",
    "simpleNet = nn.Sequential(\n",
    "    nn.Flatten(),\n",
    "    nn.Linear(784*3,neurons), # 784*3 because there are 784 pixels in an image and 3 images in the bag\n",
    "    nn.LeakyReLU(),\n",
    "    nn.BatchNorm1d(neurons),\n",
    "    nn.Linear(neurons,neurons),\n",
    "    nn.LeakyReLU(),\n",
    "    nn.BatchNorm1d(neurons),\n",
    "    nn.Linear(neurons,neurons),\n",
    "    nn.LeakyReLU(),\n",
    "    nn.BatchNorm1d(neurons),\n",
    "    nn.Linear(neurons, classes )\n",
    ")    \n",
    "simple_results = train_network(simpleNet, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader, epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.631217Z",
     "start_time": "2021-04-03T18:00:32.433308Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "application/pdf": "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pnDis9Z31TQS1GYLTpYBrk4/jA4AYCJeWYDsrkQ5S9KOpZ9vvMf3D0AAU7QKZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago8PCAvQmFzZUZvbnQgL0RlamFWdVNhbnMgL0NoYXJQcm9jcyAxNSAwIFIKL0VuY29kaW5nIDw8Ci9EaWZmZXJlbmNlcyBbIDMyIC9zcGFjZSA0NiAvcGVyaW9kIDQ4IC96ZXJvIDUwIC90d28gNTIgL2ZvdXIgNTQgL3NpeCA1NiAvZWlnaHQgL25pbmUKNjUgL0EgODIgL1IgOTcgL2EgOTkgL2MgMTAxIC9lIDEwMyAvZyAvaCAxMDggL2wgMTExIC9vIC9wIDExNCAvciAxMTcgL3UgL3YKMTIxIC95IF0KL1R5cGUgL0VuY29kaW5nID4+Ci9GaXJzdENoYXIgMCAvRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250RGVzY3JpcHRvciAxMyAwIFIKL0ZvbnRNYXRyaXggWyAwLjAwMSAwIDAgMC4wMDEgMCAwIF0gL0xhc3RDaGFyIDI1NSAvTmFtZSAvRGVqYVZ1U2FucwovU3VidHlwZSAvVHlwZTMgL1R5cGUgL0ZvbnQgL1dpZHRocyAxMiAwIFIgPj4KZW5kb2JqCjEzIDAgb2JqCjw8IC9Bc2NlbnQgOTI5IC9DYXBIZWlnaHQgMCAvRGVzY2VudCAtMjM2IC9GbGFncyAzMgovRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250TmFtZSAvRGVqYVZ1U2FucyAvSXRhbGljQW5nbGUgMAovTWF4V2lkdGggMTM0MiAvU3RlbVYgMCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMTIgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1IDc0OCA3ODcgNzg3IDc4NyA3ODcgNzg3IDgzOCA3ODcgNzMyIDczMiA3MzIgNzMyIDYxMSA2MDUKNjMwIDYxMyA2MTMgNjEzIDYxMyA2MTMgNjEzIDk4MiA1NTAgNjE1IDYxNSA2MTUgNjE1IDI3OCAyNzggMjc4IDI3OCA2MTIgNjM0CjYxMiA2MTIgNjEyIDYxMiA2MTIgODM4IDYxMiA2MzQgNjM0IDYzNCA2MzQgNTkyIDYzNSA1OTIgXQplbmRvYmoKMTUgMCBvYmoKPDwgL0EgMTYgMCBSIC9SIDE3IDAgUiAvYSAxOCAwIFIgL2MgMTkgMCBSIC9lIDIwIDAgUiAvZWlnaHQgMjEgMCBSCi9mb3VyIDIyIDAgUiAvZyAyMyAwIFIgL2ggMjQgMCBSIC9sIDI1IDAgUiAvbmluZSAyNiAwIFIgL28gMjcgMCBSIC9wIDI4IDAgUgovcGVyaW9kIDI5IDAgUiAvciAzMCAwIFIgL3NpeCAzMSAwIFIgL3NwYWNlIDMyIDAgUiAvdHdvIDMzIDAgUiAvdSAzNCAwIFIKL3YgMzUgMCBSIC95IDM2IDAgUiAvemVybyAzNyAwIFIgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL0YxIDE0IDAgUiA+PgplbmRvYmoKNCAwIG9iago8PCAvQTEgPDwgL0NBIDAgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTIgPDwgL0NBIDEgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgovQTMgPDwgL0NBIDAuOCAvVHlwZSAvRXh0R1N0YXRlIC9jYSAwLjggPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcgMCBvYmoKPDwgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL0NvdW50IDEgL0tpZHMgWyAxMCAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KZW5kb2JqCjM4IDAgb2JqCjw8IC9DcmVhdGlvbkRhdGUgKEQ6MjAyMTA0MDMxNDAwMzItMDQnMDAnKQovQ3JlYXRvciAoTWF0cGxvdGxpYiB2My4zLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAoTWF0cGxvdGxpYiBwZGYgYmFja2VuZCB2My4zLjIpID4+CmVuZG9iagp4cmVmCjAgMzkKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAwMDk0NjYgMDAwMDAgbiAKMDAwMDAwOTIyOSAwMDAwMCBuIAowMDAwMDA5MjYxIDAwMDAwIG4gCjAwMDAwMDk0MDMgMDAwMDAgbiAKMDAwMDAwOTQyNCAwMDAwMCBuIAowMDAwMDA5NDQ1IDAwMDAwIG4gCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM5NiAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAwIG4gCjAwMDAwMDEzNzEgMDAwMDAgbiAKMDAwMDAwNzkwOCAwMDAwMCBuIAowMDAwMDA3NzA4IDAwMDAwIG4gCjAwMDAwMDcyNjIgMDAwMDAgbiAKMDAwMDAwODk2MSAwMDAwMCBuIAowMDAwMDAxMzkxIDAwMDAwIG4gCjAwMDAwMDE1NTEgMDAwMDAgbiAKMDAwMDAwMTg1MSAwMDAwMCBuIAowMDAwMDAyMjI4IDAwMDAwIG4gCjAwMDAwMDI1MzEgMDAwMDAgbiAKMDAwMDAwMjg0OSAwMDAwMCBuIAowMDAwMDAzMzE0IDAwMDAwIG4gCjAwMDAwMDM0NzYgMDAwMDAgbiAKMDAwMDAwMzg4NyAwMDAwMCBuIAowMDAwMDA0MTIzIDAwMDAwIG4gCjAwMDAwMDQyNDAgMDAwMDAgbiAKMDAwMDAwNDYzMyAwMDAwMCBuIAowMDAwMDA0OTIwIDAwMDAwIG4gCjAwMDAwMDUyMjkgMDAwMDAgbiAKMDAwMDAwNTM1MCAwMDAwMCBuIAowMDAwMDA1NTgwIDAwMDAwIG4gCjAwMDAwMDU5NzAgMDAwMDAgbiAKMDAwMDAwNjA1OSAwMDAwMCBuIAowMDAwMDA2MzgwIDAwMDAwIG4gCjAwMDAwMDY2MjQgMDAwMDAgbiAKMDAwMDAwNjc2OCAwMDAwMCBuIAowMDAwMDA2OTc5IDAwMDAwIG4gCjAwMDAwMDk1MjYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyAzOCAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgMzkgPj4Kc3RhcnR4cmVmCjk2ODMKJSVFT0YK\n",
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.635405Z",
     "start_time": "2021-04-03T18:00:32.632400Z"
    }
   },
   "outputs": [],
   "source": [
    "class Flatten2(nn.Module):\n",
    "    \"\"\"\n",
    "    Takes a vector of shape (A, B, C, D, E, ...)\n",
    "    and flattens everything but the first two dimensions, \n",
    "    giving a result of shape (A, B, C*D*E*...)\n",
    "    \"\"\"\n",
    "    def forward(self, input):\n",
    "        return input.view(input.size(0), input.size(1), -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.640740Z",
     "start_time": "2021-04-03T18:00:32.636661Z"
    }
   },
   "outputs": [],
   "source": [
    "class Combiner(nn.Module):\n",
    "    \"\"\"\n",
    "    This class is used to combine a feature exraction network F and a importance prediction network W,\n",
    "    and combine their outputs by adding and summing them together. \n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, featureExtraction, weightSelection):\n",
    "        \"\"\"\n",
    "        featureExtraction: a network that takes an input of shape (B, T, D) and outputs a new \n",
    "            representation of shape (B, T, D'). \n",
    "        weightSelection: a network that takes in an input of shape (B, T, D') and outputs a \n",
    "            tensor of shape (B, T, 1) or (B, T). It should be normalized, so that the T \n",
    "            values at the end sum to one (torch.sum(_, dim=1) = 1.0)\n",
    "        \"\"\"\n",
    "        super(Combiner, self).__init__()\n",
    "        self.featureExtraction = featureExtraction\n",
    "        self.weightSelection = weightSelection\n",
    "    \n",
    "    def forward(self, input):\n",
    "        \"\"\"\n",
    "        input: a tensor of shape (B, T, D)\n",
    "        return: a new tensor of shape (B, D')\n",
    "        \"\"\"\n",
    "        features = self.featureExtraction(input) #(B, T, D) $\\boldsymbol{h}_i = F(\\boldsymbol{x}_i)$\n",
    "        weights = self.weightSelection(features) #(B, T) or (B, T, 1) for $\\boldsymbol{\\alpha}$\n",
    "        if len(weights.shape) == 2: #(B, T) shape\n",
    "            weights.unsqueese(2) #now (B, T, 1) shape\n",
    "        \n",
    "        r = features*weights #(B, T, D), computes $\\alpha_i \\cdot \\boldsymbol{h}_i$\n",
    "        \n",
    "        return torch.sum(r, dim=1) #sum over the T dimension, giving (B, D) final shape $\\bar{\\boldsymbol{x}}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.646025Z",
     "start_time": "2021-04-03T18:00:32.641977Z"
    }
   },
   "outputs": [],
   "source": [
    "T = 3\n",
    "D = 784"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.653320Z",
     "start_time": "2021-04-03T18:00:32.647525Z"
    }
   },
   "outputs": [],
   "source": [
    "backboneNetwork = nn.Sequential(\n",
    "    Flatten2(),# Shape is now (B, T, D)\n",
    "    nn.Linear(D,neurons), #Shape becomes (B, T, neurons)\n",
    "    nn.LeakyReLU(),\n",
    "    nn.Linear(neurons,neurons),\n",
    "    nn.LeakyReLU(),\n",
    "    nn.Linear(neurons,neurons),\n",
    "    nn.LeakyReLU(), #still (B, T, neurons) on the way out\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:00:32.658366Z",
     "start_time": "2021-04-03T18:00:32.655139Z"
    }
   },
   "outputs": [],
   "source": [
    "attentionMechanism = nn.Sequential(\n",
    "    #Shape is (B, T, neurons)\n",
    "    nn.Linear(neurons,neurons),\n",
    "    nn.LeakyReLU(),\n",
    "    nn.Linear(neurons, 1 ), # (B, T, 1)\n",
    "    nn.Softmax(dim=1),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.065560Z",
     "start_time": "2021-04-03T18:00:32.659504Z"
    },
    "tags": [
     "remove_output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3bc4ceaff244459986839a3e64e033e2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "simpleAttentionNet = nn.Sequential(\n",
    "        #input is (B, T, C, W, H). backbone & attention will be used by combiner to process\n",
    "        Combiner(backboneNetwork, attentionMechanism), # result is (B, neurons)\n",
    "        nn.BatchNorm1d(neurons),\n",
    "        nn.Linear(neurons,neurons),\n",
    "        nn.LeakyReLU(),\n",
    "        nn.BatchNorm1d(neurons),\n",
    "        nn.Linear(neurons, classes )\n",
    "    )\n",
    "simple_attn_results = train_network(simpleAttentionNet, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader, epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.297156Z",
     "start_time": "2021-04-03T18:06:49.066794Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "application/pdf": "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MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNSAwIG9iago8PCAvQSAxNiAwIFIgL1IgMTcgMCBSIC9TIDE4IDAgUiAvYSAxOSAwIFIgL2MgMjAgMCBSIC9lIDIxIDAgUgovZWlnaHQgMjIgMCBSIC9maXZlIDIzIDAgUiAvZm91ciAyNCAwIFIgL2cgMjUgMCBSIC9oIDI2IDAgUiAvaSAyNyAwIFIKL2wgMjggMCBSIC9tIDI5IDAgUiAvbiAzMCAwIFIgL25pbmUgMzEgMCBSIC9vIDMyIDAgUiAvcCAzMyAwIFIKL3BlcmlvZCAzNCAwIFIgL3IgMzUgMCBSIC9zZXZlbiAzNiAwIFIgL3NpeCAzNyAwIFIgL3NwYWNlIDM4IDAgUiAvdCAzOSAwIFIKL3R3byA0MCAwIFIgL3UgNDEgMCBSIC92IDQyIDAgUiAveSA0MyAwIFIgL3plcm8gNDQgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAxNCAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EzIDw8IC9DQSAwLjggL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMC44ID4+ID4+CmVuZG9iago1IDAgb2JqCjw8ID4+CmVuZG9iago2IDAgb2JqCjw8ID4+CmVuZG9iago3IDAgb2JqCjw8ID4+CmVuZG9iagoyIDAgb2JqCjw8IC9Db3VudCAxIC9LaWRzIFsgMTAgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CmVuZG9iago0NSAwIG9iago8PCAvQ3JlYXRpb25EYXRlIChEOjIwMjEwNDAzMTQwNjQ5LTA0JzAwJykKL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuMy4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuMy4yKSA+PgplbmRvYmoKeHJlZgowIDQ2CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDExNTE5IDAwMDAwIG4gCjAwMDAwMTEyODIgMDAwMDAgbiAKMDAwMDAxMTMxNCAwMDAwMCBuIAowMDAwMDExNDU2IDAwMDAwIG4gCjAwMDAwMTE0NzcgMDAwMDAgbiAKMDAwMDAxMTQ5OCAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzOTggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAxNTUxIDAwMDAwIG4gCjAwMDAwMDk4ODQgMDAwMDAgbiAKMDAwMDAwOTY4NCAwMDAwMCBuIAowMDAwMDA5MjIwIDAwMDAwIG4gCjAwMDAwMTA5MzcgMDAwMDAgbiAKMDAwMDAwMTU3MiAwMDAwMCBuIAowMDAwMDAxNzMyIDAwMDAwIG4gCjAwMDAwMDIwMzIgMDAwMDAgbiAKMDAwMDAwMjQ0MyAwMDAwMCBuIAowMDAwMDAyODIwIDAwMDAwIG4gCjAwMDAwMDMxMjMgMDAwMDAgbiAKMDAwMDAwMzQ0MSAwMDAwMCBuIAowMDAwMDAzOTA2IDAwMDAwIG4gCjAwMDAwMDQyMjYgMDAwMDAgbiAKMDAwMDAwNDM4OCAwMDAwMCBuIAowMDAwMDA0Nzk5IDAwMDAwIG4gCjAwMDAwMDUwMzUgMDAwMDAgbiAKMDAwMDAwNTE3NSAwMDAwMCBuIAowMDAwMDA1MjkyIDAwMDAwIG4gCjAwMDAwMDU2MjAgMDAwMDAgbiAKMDAwMDAwNTg1NCAwMDAwMCBuIAowMDAwMDA2MjQ3IDAwMDAwIG4gCjAwMDAwMDY1MzQgMDAwMDAgbiAKMDAwMDAwNjg0MyAwMDAwMCBuIAowMDAwMDA2OTY0IDAwMDAwIG4gCjAwMDAwMDcxOTQgMDAwMDAgbiAKMDAwMDAwNzMzNCAwMDAwMCBuIAowMDAwMDA3NzI0IDAwMDAwIG4gCjAwMDAwMDc4MTMgMDAwMDAgbiAKMDAwMDAwODAxNyAwMDAwMCBuIAowMDAwMDA4MzM4IDAwMDAwIG4gCjAwMDAwMDg1ODIgMDAwMDAgbiAKMDAwMDAwODcyNiAwMDAwMCBuIAowMDAwMDA4OTM3IDAwMDAwIG4gCjAwMDAwMTE1NzkgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyA0NSAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgNDYgPj4Kc3RhcnR4cmVmCjExNzM2CiUlRU9GCg==\n",
      "image/png": "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drfrzMwlG/lm4x4evqw/Pds13StHjQmVxx57jP79+5OcnExKSgrffvstALfccgtZWVnV1A5MTExMjeusXLkSEeHTTz8t37d582befPPN8u2MjAw++uijnxTb448/XmH7jDPO+EnnOyGq2ugfQ4YM0dqwKmev9rrv33rHP9PV6/XWyjmNaUiysrJC+v7//e9/dfjw4VpUVKSqqvn5+bpt27Zaf5+WLVvWuM7dd9+tZ511ll5//fXl+xYvXqyXXHJJ+fZrr72mkydPrvPYAlHZf1sgXSv5TbW1qgLkrHqbQXubemuM4+Op8GNm7Z6z00C4+PidCHl5ebRr145mzZoB0K5du/JjI0aMYPr06aSmphITE8PkyZNZuHAhrVu35vHHH+eee+5h69atPPPMM1x++eW8/vrrzJs3j+LiYjZt2sTEiRP54x//eMx7/vnPf+btt9+muLiYsWPHli+t7ktVeffdd/nss884++yzKSoqIjo6mqlTp5KdnU1KSgoTJkxgxowZHD58mKVLl3Lfffdx6aWX8utf/5rMzEzKysp4+OGHGTNmDK+//jrz58+nsLCQDRs2MHbsWJ544gmmTp1avtBj//79mTVrFjExMRQUFKCq3HPPPXz88ceICA888ADjxo3j888/5+GHH6Zdu3asXr2aIUOG8M9//vMn/YZZB32AHv3QnXp7TQqtWkSFOhxjmqQLLriAnJwcTjnlFH71q1/xxRdfVFru0KFDjBgxguXLlxMbG8sDDzzAZ599xrx583jooYfKyy1btoxZs2aRkZHBO++8c8yd/xYsWMC6detYtmwZGRkZLF++nCVLlhzzfl999RU9e/akV69ejBgxorw7atq0aZx99tlkZGRw77338sgjjzBu3DgyMjIYN24cjz32GOeddx5paWksXryYu+++m0OHDgFOt9acOXPIzMxkzpw55OTkMG3atPKFHmfNmlUhhvfee4+MjAxWrVrFwoULufvuu8nLywOcbrRnnnmGrKwsNm7cyFdffXXi/xGw1XED8nFmHrPTcrhjRC9O72VTb40BqmwZBEtMTAzLly/nyy+/ZPHixYwbN45p06YdcwOmqKgoLrroIgAGDhxIs2bNiIyMZODAgWzevLm83OjRo2nb1vk3fcUVV7B06VJSU4+usLFgwQIWLFhQvpZVQUEB69at45xzzqnwfm+99Vb5fTnG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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')\n",
    "sns.lineplot(x='epoch', y='val Accuracy', data=simple_attn_results, label='Simple Attention')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.300954Z",
     "start_time": "2021-04-03T18:06:49.298384Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "set_seed(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.687226Z",
     "start_time": "2021-04-03T18:06:49.303858Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True Label is =  9\n"
     ]
    },
    {
     "data": {
      "application/pdf": "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MCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL1hIZWlnaHQgMCA+PgplbmRvYmoKMTUgMCBvYmoKWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMAo2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDMxOCA0MDEgNDYwIDgzOCA2MzYKOTUwIDc4MCAyNzUgMzkwIDM5MCA1MDAgODM4IDMxOCAzNjEgMzE4IDMzNyA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2CjYzNiA2MzYgMzM3IDMzNyA4MzggODM4IDgzOCA1MzEgMTAwMCA2ODQgNjg2IDY5OCA3NzAgNjMyIDU3NSA3NzUgNzUyIDI5NQoyOTUgNjU2IDU1NyA4NjMgNzQ4IDc4NyA2MDMgNzg3IDY5NSA2MzUgNjExIDczMiA2ODQgOTg5IDY4NSA2MTEgNjg1IDM5MCAzMzcKMzkwIDgzOCA1MDAgNTAwIDYxMyA2MzUgNTUwIDYzNSA2MTUgMzUyIDYzNSA2MzQgMjc4IDI3OCA1NzkgMjc4IDk3NCA2MzQgNjEyCjYzNSA2MzUgNDExIDUyMSAzOTIgNjM0IDU5MiA4MTggNTkyIDU5MiA1MjUgNjM2IDMzNyA2MzYgODM4IDYwMCA2MzYgNjAwIDMxOAozNTIgNTE4IDEwMDAgNTAwIDUwMCA1MDAgMTM0MiA2MzUgNDAwIDEwNzAgNjAwIDY4NSA2MDAgNjAwIDMxOCAzMTggNTE4IDUxOAo1OTAgNTAwIDEwMDAgNTAwIDEwMDAgNTIxIDQwMCAxMDIzIDYwMCA1MjUgNjExIDMxOCA0MDEgNjM2IDYzNiA2MzYgNjM2IDMzNwo1MDAgNTAwIDEwMDAgNDcxIDYxMiA4MzggMzYxIDEwMDAgNTAwIDUwMCA4MzggNDAxIDQwMSA1MDAgNjM2IDYzNiAzMTggNTAwCjQwMSA0NzEgNjEyIDk2OSA5NjkgOTY5IDUzMSA2ODQgNjg0IDY4NCA2ODQgNjg0IDY4NCA5NzQgNjk4IDYzMiA2MzIgNjMyIDYzMgoyOTUgMjk1IDI5NSAyOTUgNzc1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b3VudCAxIC9LaWRzIFsgMTAgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CmVuZG9iagoyOCAwIG9iago8PCAvQ3JlYXRpb25EYXRlIChEOjIwMjEwNDAzMTQwNjQ5LTA0JzAwJykKL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuMy4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuMy4yKSA+PgplbmRvYmoKeHJlZgowIDI5CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDA4OTg3IDAwMDAwIG4gCjAwMDAwMDQ3OTggMDAwMDAgbiAKMDAwMDAwNDgzMCAwMDAwMCBuIAowMDAwMDA0OTI5IDAwMDAwIG4gCjAwMDAwMDQ5NTAgMDAwMDAgbiAKMDAwMDAwNDk3MSAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDA0MDEgMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAxNDkzIDAwMDAwIG4gCjAwMDAwMDUwMjUgMDAwMDAgbiAKMDAwMDAwNjI4OSAwMDAwMCBuIAowMDAwMDA3NDQyIDAwMDAwIG4gCjAwMDAwMDM2NDUgMDAwMDAgbiAKMDAwMDAwMzQ0NSAwMDAwMCBuIAowMDAwMDAzMTA0IDAwMDAwIG4gCjAwMDAwMDQ2OTggMDAwMDAgbiAKMDAwMDAwMTUxNCAwMDAwMCBuIAowMDAwMDAxODM0IDAwMDAwIG4gCjAwMDAwMDIyMjcgMDAwMDAgbiAKMDAwMDAwMjM3OSAwMDAwMCBuIAowMDAwMDAyNTAwIDAwMDAwIG4gCjAwMDAwMDI4MjEgMDAwMDAgbiAKMDAwMDAwNjI2OCAwMDAwMCBuIAowMDAwMDA3NDIyIDAwMDAwIG4gCjAwMDAwMDg5NjYgMDAwMDAgbiAKMDAwMDAwOTA0NyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9JbmZvIDI4IDAgUiAvUm9vdCAxIDAgUiAvU2l6ZSAyOSA+PgpzdGFydHhyZWYKOTIwNAolJUVPRgo=\n",
      "image/png": "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kycH411dXfVMR4MHDw7G165dW9d+AQCoNz6BAgAAiMQACgAAIBIDKAAAgEgMoAAAACJxEXnBfeITn+gWmz17drDt7rvvHoxvvvnmwbi7155YFS655JJg/MILL6xrvwDQCgYOHBiMjx07Nhi/9tprg/FDDjmkW2zlypXBtieeeGIw/ulPfzoYzzJv3rxg/Be/+EXUflpZnwZQZva8pDclbZC03t3rO60LKDhqAqhETaBd5fEJ1OfcfU0O+wHaBTUBVKIm0Ha4BgoAACBSXwdQLul3ZrbAzCaFGpjZJDN7zMwe62NfQCugJoBK1ATaUl+/wjvE3V81s20l3W9mS9x9bnkDd58uabokmVl9r1oGmo+aACpRE2hLfRpAufurpT9XmdlsSQdImtvzVgi57LLLgvHTTjutW2yPPfYItq33rLpY9957b7NTaDhqIj9bbrllMD5lypRusZNOOinYNqsmHnzwwWD8xhtvDMYXLFgQjKN31ES2s88+Oxi/6qqrovYzYsSIbrFvfetbwbahGXtS/Pnja1/7WjCeNet71qxZUftvBTV/hWdmW5rZRzf+LOmLkp7KKzGg1VATQCVqAu2sL59AbSdptplt3M9P3b3zPnIAPkRNAJWoCbStmgdQ7r5MUtydt4A2Rk0AlagJtDNuYwAAABCJARQAAEAka+TMLaanSuedd14wnjVjYuedd+4WK11P0E3RZuENGTIkGF+7dm2DM8nm7uFfZoNQE9kWLVoUjO+5557dYrE1kdV+9erVwfiwYcOC8XZETeRv//33D8b/+Mc/BuMDBgyI2v/rr7/eLTZ06NBg20ceeSQYf+qp8LX9oXqTpEMPPTQYf+6554Lxgw8+OBhftWpVMF4kWTXBJ1AAAACRGEABAABEYgAFAAAQiQEUAABAJAZQAAAAkfr6MGFkCD2vS5KuuOKKYHyTTfo+lg3NxJCk+fPnB+NLly4NxsePHx+MZ82qA6qR9Wy72267LRjfe++9g/HFixd3i913333BtkuWLAnGd9ppp2D84osvDsZnzpwZjH/5y18OxoFykydPDsazZttlzR69/fbbg/EDDzywW+xnP/tZsO35558fjGfNTD3iiCOC8Tlz5gTju+66azCeVaOjR48Oxt96661gvEj4BAoAACASAygAAIBIDKAAAAAiMYACAACIxAAKAAAgErPw+mivvfYKxr/y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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = largest_train[0] # Select a data point (which is a bag)\n",
    "x = x.to(device) #move it to the compute device\n",
    "\n",
    "with torch.no_grad():\n",
    "    weights = attentionMechanism(backboneNetwork(x.unsqueeze(0))) #apply score(F(x))\n",
    "    weights = weights.cpu().numpy().ravel() #convert to numpy array\n",
    "\n",
    "f, axarr = plt.subplots(1,3, figsize=(10,10))#make a plot for all 3 digits\n",
    "for i in range(3):\n",
    "    axarr[i].imshow(x[i,0,:].cpu().numpy(), cmap='gray', vmin=0, vmax=1) # Plot the digit\n",
    "    axarr[i].text(0.0, 0.5, str(round(weights[i],2)), dict(size=40, color='red')) #Draw the attention score in the top left\n",
    "    \n",
    "print(\"True Label is = \", y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.692283Z",
     "start_time": "2021-04-03T18:06:49.688747Z"
    }
   },
   "outputs": [],
   "source": [
    "class DotScore(nn.Module):\n",
    "\n",
    "    def __init__(self, H):\n",
    "        \"\"\"\n",
    "        H: the number of dimensions coming into the dot score. \n",
    "        \"\"\"\n",
    "        super(DotScore, self).__init__()\n",
    "        self.H = H\n",
    "    \n",
    "    def forward(self, states, context):\n",
    "        \"\"\"\n",
    "        states: (B, T, H) shape\n",
    "        context: (B, H) shape\n",
    "        output: (B, T, 1), giving a score to each of the T items based on the context \n",
    "        \n",
    "        \"\"\"\n",
    "        T = states.size(1)\n",
    "        #compute $\\boldsymbol{h}_t^\\top \\bar{\\boldsymbol{h}}$\n",
    "        scores = torch.bmm(states,context.unsqueeze(2)) / np.sqrt(self.H) #(B, T, H) -> (B, T, 1)\n",
    "        return scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.700060Z",
     "start_time": "2021-04-03T18:06:49.693366Z"
    }
   },
   "outputs": [],
   "source": [
    "class GeneralScore(nn.Module):\n",
    "\n",
    "    def __init__(self, H):\n",
    "        \"\"\"\n",
    "        H: the number of dimensions coming into the dot score. \n",
    "        \"\"\"\n",
    "        super(GeneralScore, self).__init__()\n",
    "        self.w = nn.Bilinear(H, H, 1) #stores $W$\n",
    "    \n",
    "    def forward(self, states, context):\n",
    "        \"\"\"\n",
    "        states: (B, T, H) shape\n",
    "        context: (B, H) shape\n",
    "        output: (B, T, 1), giving a score to each of the T items based on the context \n",
    "        \n",
    "        \"\"\"\n",
    "        T = states.size(1)\n",
    "        #Repeating the values T times \n",
    "        context = torch.stack([context for _ in range(T)], dim=1) #(B, H) -> (B, T, H)\n",
    "        #computes $\\boldsymbol{h}_{t}^{\\top} W \\bar{\\boldsymbol{h}}$\n",
    "        scores = self.w(states, context) #(B, T, H) -> (B, T, 1)\n",
    "        return scores        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.706634Z",
     "start_time": "2021-04-03T18:06:49.701734Z"
    }
   },
   "outputs": [],
   "source": [
    "class AdditiveAttentionScore(nn.Module):\n",
    "\n",
    "    def __init__(self, H):\n",
    "        super(AdditiveAttentionScore, self).__init__()\n",
    "        self.v = nn.Linear(H, 1) \n",
    "        self.w = nn.Linear(2*H, H)#2*H because we are going to concatenate two inputs\n",
    "    \n",
    "    def forward(self, states, context):\n",
    "        \"\"\"\n",
    "        states: (B, T, H) shape\n",
    "        context: (B, H) shape\n",
    "        output: (B, T, 1), giving a score to each of the T items based on the context \n",
    "        \n",
    "        \"\"\"\n",
    "        T = states.size(1)\n",
    "        #Repeating the values T times \n",
    "        context = torch.stack([context for _ in range(T)], dim=1) #(B, H) -> (B, T, H)\n",
    "        state_context_combined = torch.cat((states, context), dim=2) #(B, T, H) + (B, T, H)  -> (B, T, 2*H)\n",
    "        scores = self.v(torch.tanh(self.w(state_context_combined))) # (B, T, 2*H) -> (B, T, 1)\n",
    "        return scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.712834Z",
     "start_time": "2021-04-03T18:06:49.708312Z"
    }
   },
   "outputs": [],
   "source": [
    "class ApplyAttention(nn.Module):\n",
    "    \"\"\"\n",
    "    This helper module is used to apply the results of an attention mechanism toa set of inputs. \n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self):\n",
    "        super(ApplyAttention, self).__init__()\n",
    "        \n",
    "    def forward(self, states, attention_scores, mask=None):\n",
    "        \"\"\"\n",
    "        states: (B, T, H) shape giving the T different possible inputs\n",
    "        attention_scores: (B, T, 1) score for each item at each context\n",
    "        mask: None if all items are present. Else a boolean tensor of shape \n",
    "            (B, T), with `True` indicating which items are present / valid. \n",
    "            \n",
    "        returns: a tuple with two tensors. The first tensor is the final context\n",
    "        from applying the attention to the states (B, H) shape. The second tensor\n",
    "        is the weights for each state with shape (B, T, 1). \n",
    "        \"\"\"\n",
    "        \n",
    "        if mask is not None:\n",
    "            #set everything not present to a large negative value that will cause vanishing gradients \n",
    "            attention_scores[~mask] = -1000.0\n",
    "        #compute the weight for each score\n",
    "        weights = F.softmax(attention_scores, dim=1) #(B, T, 1) still, but sum(T) = 1\n",
    "    \n",
    "        final_context = (states*weights).sum(dim=1) #(B, T, D) * (B, T, 1) -> (B, D)\n",
    "        return final_context, weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.718546Z",
     "start_time": "2021-04-03T18:06:49.714176Z"
    }
   },
   "outputs": [],
   "source": [
    "def getMaskByFill(x, time_dimension=1, fill=0):\n",
    "    \"\"\"\n",
    "    x: the original input with three or more dimensions, (B, ..., T, ...)\n",
    "        which may have unsued items in the tensor. B is the batch size, \n",
    "        and T is the time dimension. \n",
    "    time_dimension: the axis in the tensor `x` that denotes the time dimension\n",
    "    fill: the constant used to denote that an item in the tensor is not in use,\n",
    "        and should be masked out (`False` in the mask). \n",
    "    \n",
    "    return: A boolean tensor of shape (B, T), where `True` indicates the value\n",
    "        at that time is good to use, and `False` that it is not. \n",
    "    \"\"\"\n",
    "    to_sum_over = list(range(1,len(x.shape))) #skip the first dimension 0 because that is the batch dimension\n",
    "    \n",
    "    if time_dimension in to_sum_over:\n",
    "        to_sum_over.remove(time_dimension)\n",
    "        \n",
    "    with torch.no_grad():\n",
    "        #(x!=fill) determines locations that might be unused, beause they are \n",
    "        #missing the fill value we are looking for to indicate lack of use. \n",
    "        #We then count the number of non-fill values over everything in that\n",
    "        #time slot (reducing changes the shape to (B, T)). If any one entry \n",
    "        #is non equal to this value, the item represent must be in use - \n",
    "        #so return a value of true. \n",
    "        mask = torch.sum((x != fill), dim=to_sum_over) > 0\n",
    "    return mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.726023Z",
     "start_time": "2021-04-03T18:06:49.719880Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ True,  True, False],\n",
      "        [ True,  True,  True],\n",
      "        [ True,  True,  True],\n",
      "        [False, False, False],\n",
      "        [ True,  True,  True]])\n"
     ]
    }
   ],
   "source": [
    "with torch.no_grad():\n",
    "    x = torch.rand((5,3,1,7,7))\n",
    "    x[0,-1,:] = 0 #Don't use the last item in the first input\n",
    "    x[3,:] = 0 #Don't use any of the 4'th item!\n",
    "    x[4,0,0,0] = 0 #Make it _look_ like we aren't using part of the 5th, but we still are!\n",
    "    #This last line was added to show that this works even on tricky inputs\n",
    "    \n",
    "    mask = getMaskByFill(x)\n",
    "print(mask)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:06:49.734611Z",
     "start_time": "2021-04-03T18:06:49.727659Z"
    },
    "tags": [
     "remove_cell"
    ]
   },
   "outputs": [],
   "source": [
    "class SmarterAttentionNet(nn.Module):\n",
    "\n",
    "    def __init__(self, input_size, hidden_size, out_size, score_net=None):\n",
    "        super(SmarterAttentionNet, self).__init__()\n",
    "        self.backbone = nn.Sequential(\n",
    "            Flatten2(),# Shape is now (B, T, D)\n",
    "            nn.Linear(input_size,hidden_size), #Shape becomes (B, T, H)\n",
    "            nn.LeakyReLU(),\n",
    "            nn.Linear(hidden_size,hidden_size),\n",
    "            nn.LeakyReLU(),\n",
    "            nn.Linear(hidden_size,hidden_size),\n",
    "            nn.LeakyReLU(),\n",
    "        )#returns (B, T, H)\n",
    "        \n",
    "        #Try changing this and see how the results change!\n",
    "        self.score_net = AdditiveAttentionScore(hidden_size) if (score_net is None) else score_net\n",
    "\n",
    "        self.apply_attn = ApplyAttention()\n",
    "        \n",
    "        self.prediction_net = nn.Sequential( #(B, H), \n",
    "            nn.BatchNorm1d(hidden_size),\n",
    "            nn.Linear(hidden_size,hidden_size),\n",
    "            nn.LeakyReLU(),\n",
    "            nn.BatchNorm1d(hidden_size),\n",
    "            nn.Linear(hidden_size, out_size ) #(B, H)\n",
    "        )\n",
    "        \n",
    "    \n",
    "    def forward(self, input):\n",
    "\n",
    "        mask = getMaskByFill(input)\n",
    "\n",
    "        h = self.backbone(input) #(B, T, D) -> (B, T, H)\n",
    "\n",
    "        #h_context = torch.mean(h, dim=1) \n",
    "        #computes torch.mean but ignoring the masked out parts\n",
    "        #first add together all the valid items\n",
    "        h_context = (mask.unsqueeze(-1)*h).sum(dim=1)#(B, T, H) -> (B, H)\n",
    "        #then divide by the number of valid items, pluss a small value incase a bag was all empty\n",
    "        h_context = h_context/(mask.sum(dim=1).unsqueeze(-1)+1e-10)\n",
    "\n",
    "        scores = self.score_net(h, h_context) # (B, T, H) , (B, H) -> (B, T, 1)\n",
    "\n",
    "        final_context, _ = self.apply_attn(h, scores, mask=mask)\n",
    "\n",
    "        return self.prediction_net(final_context)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:25:54.246651Z",
     "start_time": "2021-04-03T18:06:49.736072Z"
    },
    "tags": [
     "remove_output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e3e0affeb0c84656a30ef76d3f9faa6c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5384fc792fbe43ee9720a69636e86f16",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5e0ef3fb6bcf46f5abf257f3cf99549c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=10.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=469.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(HTML(value='Validating'), FloatProgress(value=0.0, max=79.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "attn_dot = SmarterAttentionNet(D, neurons, classes, score_net=DotScore(neurons))\n",
    "attn_gen = SmarterAttentionNet(D, neurons, classes, score_net=GeneralScore(neurons))\n",
    "attn_add = SmarterAttentionNet(D, neurons, classes, score_net=AdditiveAttentionScore(neurons))\n",
    "\n",
    "attn_results_dot = train_network(attn_dot, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)\n",
    "attn_results_gen = train_network(attn_gen, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)\n",
    "attn_results_add = train_network(attn_add, nn.CrossEntropyLoss(), train_loader, val_loader=test_loader,epochs=epochs, score_funcs={'Accuracy': accuracy_score}, device=device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:25:54.555308Z",
     "start_time": "2021-04-03T18:25:54.247830Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='epoch', ylabel='val Accuracy'>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "application/pdf": "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MCAwLjAwMSAwIDAgXSAvTGFzdENoYXIgMjU1IC9OYW1lIC9EZWphVnVTYW5zCi9TdWJ0eXBlIC9UeXBlMyAvVHlwZSAvRm9udCAvV2lkdGhzIDEyIDAgUiA+PgplbmRvYmoKMTMgMCBvYmoKPDwgL0FzY2VudCA5MjkgL0NhcEhlaWdodCAwIC9EZXNjZW50IC0yMzYgL0ZsYWdzIDMyCi9Gb250QkJveCBbIC0xMDIxIC00NjMgMTc5NCAxMjMzIF0gL0ZvbnROYW1lIC9EZWphVnVTYW5zIC9JdGFsaWNBbmdsZSAwCi9NYXhXaWR0aCAxMzQyIC9TdGVtViAwIC9UeXBlIC9Gb250RGVzY3JpcHRvciAvWEhlaWdodCAwID4+CmVuZG9iagoxMiAwIG9iagpbIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4MzggMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAzMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3NTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4NCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1IDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEgNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2MDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1IDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEwMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0NzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1MDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3NCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3IDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMgNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2MzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5MiBdCmVuZG9iagoxNSAwIG9iago8PCAvQSAxNiAwIFIgL0QgMTcgMCBSIC9HIDE4IDAgUiAvUiAxOSAwIFIgL1MgMjAgMCBSIC9hIDIxIDAgUiAvYyAyMiAwIFIKL2QgMjMgMCBSIC9lIDI0IDAgUiAvZWlnaHQgMjUgMCBSIC9maXZlIDI2IDAgUiAvZm91ciAyNyAwIFIgL2cgMjggMCBSCi9oIDI5IDAgUiAvaSAzMCAwIFIgL2wgMzEgMCBSIC9tIDMyIDAgUiAvbiAzMyAwIFIgL25pbmUgMzQgMCBSIC9vIDM1IDAgUgovcCAzNiAwIFIgL3BlcmlvZCAzNyAwIFIgL3IgMzggMCBSIC9zZXZlbiAzOSAwIFIgL3NpeCA0MCAwIFIgL3NwYWNlIDQxIDAgUgovdCA0MiAwIFIgL3R3byA0MyAwIFIgL3UgNDQgMCBSIC92IDQ1IDAgUiAveSA0NiAwIFIgL3plcm8gNDcgMCBSID4+CmVuZG9iagozIDAgb2JqCjw8IC9GMSAxNCAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9DQSAwIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EyIDw8IC9DQSAxIC9UeXBlIC9FeHRHU3RhdGUgL2NhIDEgPj4KL0EzIDw8IC9DQSAwLjggL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMC44ID4+ID4+CmVuZG9iago1IDAgb2JqCjw8ID4+CmVuZG9iago2IDAgb2JqCjw8ID4+CmVuZG9iago3IDAgb2JqCjw8ID4+CmVuZG9iagoyIDAgb2JqCjw8IC9Db3VudCAxIC9LaWRzIFsgMTAgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CmVuZG9iago0OCAwIG9iago8PCAvQ3JlYXRpb25EYXRlIChEOjIwMjEwNDAzMTQyNTU0LTA0JzAwJykKL0NyZWF0b3IgKE1hdHBsb3RsaWIgdjMuMy4yLCBodHRwczovL21hdHBsb3RsaWIub3JnKQovUHJvZHVjZXIgKE1hdHBsb3RsaWIgcGRmIGJhY2tlbmQgdjMuMy4yKSA+PgplbmRvYmoKeHJlZgowIDQ5CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNiAwMDAwMCBuIAowMDAwMDEyNzY0IDAwMDAwIG4gCjAwMDAwMTI1MjcgMDAwMDAgbiAKMDAwMDAxMjU1OSAwMDAwMCBuIAowMDAwMDEyNzAxIDAwMDAwIG4gCjAwMDAwMTI3MjIgMDAwMDAgbiAKMDAwMDAxMjc0MyAwMDAwMCBuIAowMDAwMDAwMDY1IDAwMDAwIG4gCjAwMDAwMDAzOTggMDAwMDAgbiAKMDAwMDAwMDIwOCAwMDAwMCBuIAowMDAwMDAxOTA1IDAwMDAwIG4gCjAwMDAwMTEwOTkgMDAwMDAgbiAKMDAwMDAxMDg5OSAwMDAwMCBuIAowMDAwMDEwNDI0IDAwMDAwIG4gCjAwMDAwMTIxNTIgMDAwMDAgbiAKMDAwMDAwMTkyNiAwMDAwMCBuIAowMDAwMDAyMDg2IDAwMDAwIG4gCjAwMDAwMDIzMTkgMDAwMDAgbiAKMDAwMDAwMjYzNiAwMDAwMCBuIAowMDAwMDAyOTM2IDAwMDAwIG4gCjAwMDAwMDMzNDcgMDAwMDAgbiAKMDAwMDAwMzcyNCAwMDAwMCBuIAowMDAwMDA0MDI3IDAwMDAwIG4gCjAwMDAwMDQzMjcgMDAwMDAgbiAKMDAwMDAwNDY0NSAwMDAwMCBuIAowMDAwMDA1MTEwIDAwMDAwIG4gCjAwMDAwMDU0MzAgMDAwMDAgbiAKMDAwMDAwNTU5MiAwMDAwMCBuIAowMDAwMDA2MDAzIDAwMDAwIG4gCjAwMDAwMDYyMzkgMDAwMDAgbiAKMDAwMDAwNjM3OSAwMDAwMCBuIAowMDAwMDA2NDk2IDAwMDAwIG4gCjAwMDAwMDY4MjQgMDAwMDAgbiAKMDAwMDAwNzA1OCAwMDAwMCBuIAowMDAwMDA3NDUxIDAwMDAwIG4gCjAwMDAwMDc3MzggMDAwMDAgbiAKMDAwMDAwODA0NyAwMDAwMCBuIAowMDAwMDA4MTY4IDAwMDAwIG4gCjAwMDAwMDgzOTggMDAwMDAgbiAKMDAwMDAwODUzOCAwMDAwMCBuIAowMDAwMDA4OTI4IDAwMDAwIG4gCjAwMDAwMDkwMTcgMDAwMDAgbiAKMDAwMDAwOTIyMSAwMDAwMCBuIAowMDAwMDA5NTQyIDAwMDAwIG4gCjAwMDAwMDk3ODYgMDAwMDAgbiAKMDAwMDAwOTkzMCAwMDAwMCBuIAowMDAwMDEwMTQxIDAwMDAwIG4gCjAwMDAwMTI4MjQgMDAwMDAgbiAKdHJhaWxlcgo8PCAvSW5mbyA0OCAwIFIgL1Jvb3QgMSAwIFIgL1NpemUgNDkgPj4Kc3RhcnR4cmVmCjEyOTgxCiUlRU9GCg==\n",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEGCAYAAABy53LJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABSh0lEQVR4nO3deXhU5dn48e89k5nsC5CFhLCEfQ0BwiZqcdfXKnUruLTW1roUXNr+3kptrVSrtb5qbRW11lptRcBda21FcQVF1sgWlrAmELLvmcz6/P6YIQwhwAQzTID7c11zzZxznnPmPhOYe57lPEeMMSillFKhskQ6AKWUUicWTRxKKaU6RBOHUkqpDtHEoZRSqkM0cSillOqQqEgHcDykpqaafv36RToMpZQ6oaxatarSGJPWdv0pkTj69evHypUrIx2GUkqdUERkV3vrtalKKaVUh2jiUEop1SFhTRwicqGIbBaRIhGZ3c72biLypoisFZHlIjIysH6IiBQEPepF5M7Atjkisido2/+E8xyUUkodLGx9HCJiBeYC5wElwAoReccYszGo2N1AgTHmMhEZGih/jjFmM5AXdJw9wJtB+/3RGPNIuGJXSil1eOGscUwAiowx240xLmABMK1NmeHAYgBjzCagn4hktClzDrDNGNNuJ41SSqnjK5yJoxdQHLRcElgX7GvgcgARmQD0BbLblJkBzG+zblageet5EenW3puLyE0islJEVlZUVBzrOSillGojnIlD2lnXdireh4BuIlIA3AasATytBxCxA5cCrwbt8zQwAH9TVinwaHtvbox51hiTb4zJT0s7ZBiyUkqpYxTO6zhKgN5By9nA3uACxph64AYAERFgR+Cx30XAamNMWdA+ra9F5K/Au50euVJKfROuJnA1g88Dxgs+b+C1z//aBJZ93gPrDirrPfD6aGWNL2j7/rK+A9tHz4AeAzr19MKZOFYAg0QkB3/n9gzgmuACIpICNAf6QG4EPgskk/2upk0zlYhkGmNKA4uXAevDE75SSh2FMfjKt+Na8zHO9Stxbd2Cs7gMV7WTqFgvsT1cxPZwE9vDhdUeoXsf9Z544iQOY4xHRGYB7wNW4HljzAYRuSWw/RlgGPAPEfECG4Ef7d9fROLwj8i6uc2hHxaRPPzNXjvb2a6UUp3OV1+Lc/UnuNZ+iXNzIc5de3CVN+JqEDCBlnkBe/doorKz8NQ4qNxQ1dpAb8/sQeygbGIG9SZ2cF9icrKR6GgQK1gsYIkKvLYGvbYEnqP861u3W9uUtQStCy4bnt4IORXuAJifn290yhGlVCi8DQ041q6mYfVymrZuo2lvNY4aL05XNO6oWDxRcXiiYjAJ8fgSUvDGd8cb1w23LQm314qzxYu7xUuU3UJMXBR2ixubu4moxioslXuJqq/E5m7EZpwk9OpB4qA+JI4YRMq4kcT2642/1b5rEJFVxpj8tutPibmqlFKnDmMMbqcXZ7MHl8OD0+HB1Rx4dnha1ztqm2iprKOlqhZnYwsuF7iNHY81Fp/FBozzP1LxP4LfQwzYvXhtbrw2F+6oRlzWSpwxzTiSmnBIE7HEkehLIc6TRLQ1jihLBmLvhenRphZQGnh8WITFt5Foi5voWCuxKbHEZ3QjNiWOmAQbsQk2YhJsxMTbDizH24iyW4/L5xpME4dSJzBjDD6vwRp1/GcP8hkf22u3U1BRwJryNZQ3l2O1WImSKKxi9b+2RPmXLVas4l9u3Ra0fv/y4bYfaX2UJQpfs1D5tYfy1U6aK72Hjt9sw+J1EeVx+B9eBxavA2Ntxm1rocHmoDauhcoEB1WJDpy2FlxWB86oFlzWZpxRDrwWN3H2OOJt8f5HlP85zuZflxwVS6O7ihLHViodlVS2VFLnrANAjIVoTxyx7nhiPAn08PagX0N3MmvjSayLxt4QBVV2msoSqN0Wjzs6EY819rDnEmW3tCYUf3KxH7Tcd1QPknocfv9joYlDqRNQdWkTW5bvY+uKMhprneTkpjJ0ciZ9hnfHYg1PEml2N7Ouch0F5QWsqVjD2vK1NLgbAOge053eib3xGR8enwev8eL1efEYz0HLXuM9eLvPg8d4jvLOh2GgZ0N/RpRNoX9VHlYTRb1tG4atJDqa6dbgILXWQaKjuTVJuC0OqlJaqO7uoTbNRmPPBJy9UzFZvYlL7kV8dHfSbfHkBJJAgi3hQEIIJId4WzwxUTFYpGOfs8vrorqlmipHlT+ZBD2qWqpY5djRukxjEwNKDQP3wqC9hgF7hXh3HG5bAo6YBCozU2ns2RNXaiYk98TYUnC7onE3uqitaMbV5MXp8H+ul6bnaeJQ6lTVWNPClhVlbF1RRmVxIyKQPTCePn2EosJytq2uIC7ex5AhLoYNbqJbkgO87sDDBb6g114XeD1Br92B7f7XxuOk1NdCga+JAlooEBebxYdPQIxhgNdwgcvLmBYXeS0OertKEFMACIj4O2vFEli2tLPuwHojFnwIXrHgEQtey/7XghfwWCx4RfCIBQ/QUhNLacU49rZMoll6YvU207N8Cb1KlpDQ5B9waaJ9SLIHW7KH2P4JJOTkEDd8AlFDJiCZuZDSxx/DcWS32ukZ35Oe8T2PWrbZ3UxVS1VrktndXEFj8Q4sG7cRu6WEHtvWMeDTZdgCObc2Hooyha1ZQlEW7BxuIz4pjZ5RvZiUnEJvunfquWjnuFJdWEuTm22ry9myvIy9RbVgID2thUEpGxjgfIuYmkKMAYm2UOwdS6HjbHY5x2GwkmHbzLDYxQyMWUq0pfnAQcUKVnvgYQOrDbfVxiZbFAU2CwVWQ4HVS7n4AIhFyJU48qyJ5EUlk2vrRlJUbNAxovzPYgFj/NcVEHg2vqB1HLruoLIHno3Xi6uqGVd5E87yJlrKmilvSGVn9HjKUsfgs9pJqt9J76ov6G3dSHwPC9Gp0dhT7UT3zSZq4DjoOQoyRkBsynH+qx0fxuXCsXkztWuW01CwBs+6jViKA4lToL5nInv6xDH8J3cxbOJFx/Qeh+sc18ShThg+lwv3nj249+5FRBC73f+IjkZsdizR9oPX2e1ImIYjHiufy4WvsbH14W1sxNfYhK/pwLKrvpk9lXZ21ydT5knDiJV4ZzmZVV+RUbacmMZKjPfQ87LExxLVoxue1F6UdhtDsQyk3hOP1WLo29fC0PE96DOuH9bkJGpbaimoKKCgvICCigI2VG6gxdsCQFZ8Fnnpef5HWh6Dug0iyhKexgnjcuHavRtn0Tac24pwbduGs2gbrh07MG43HmsM+zLGs7fPWTTGZBAlXvpluRk+MY2siYOxJieHJa4TlbeuDse69Ti+LsCxdi0tX68l+6mniBs75piOp4lDE0eXZ4zBU1GBu6QEd0kJruJi3MWB1yUleMrK/L9KO8Jmw2KzHZxMAgnGYgteF43YbVjsdsR+8Dqx27EEklNrebsNsUbhczj8SaCpTSLYnxiamg5KFMbtbjdMn1io6TaUsvR8KlJH442KIdpVQ2btCrLrvyLFWkVUt1QsPTKxpPfD0iMLa2ICloQEEAueyko8FRV4ystbn90VFdTbMyjtOZmy9Hw8tjiiW6pJq/wKe+OXNNqrqUsQLGmpJGX1pWefofTrP5a03kOISk/HmhDfCX/VwPk5nbh27DiQIIq24dy2Ddfu3eAJtLeIYMvOJnrAAJqzR7LDDGBXmR2PB1J7JzDijF4MnpCBPUZb2ENljAFjjvkHlCYOTRxdgrexCfeeoMRQsgd3cTGukhLce/ZgWloOFBYhKiMDW3YvLL2yqO1uZ3eCk22x9dijoulhTaabJZ4UiSeZWBIllmifBVwufC4XxunCuPY/nIeuczox+8sebp3T6Z++IQQSHY0lIQFLQjzW+ITA68ByQgKW+KDl2BjEVUFVWQ07SmPYUZdDi0nCLo0MiFvJ4H7VZA3vhaXfROiVDzFJIX/Gze5mNlRtoKBsDRt2raBk5zrs1Q761OTS03UaNjMYEJLdJWTXFJC2cymW5vpDjiNxcdjS0ohKSyMqPf3Ac/rB6ywJCa3XHviamnBu33FQ7cG5fRvu4pIDn6PVir1PH6IHDsA+YADRgYdk9WHb+nrWf7aHit0NRNksDBqfwYgzepHeL7FLXd9wqtDEoYnjuDAeD+59ZbhLig9NDCUleKurDypvSUjA1rs39uxsbNnZ2HpnE9WrF6XJXjbaKlhbv4l1Fesoqi3Ca7wApMem0+Jtod516JddtDWatNg00uPSSY9LJy0ujYy4DNJi00iL869Pi00jzhbXoXMyLhc+pxPjcmPcgQTj8WKJj8MSH481Ph6x2w9/kMYKKP4Kir+iess2tuzswVbHZOq9PbGKi37p+xg80k7fyaOwZg33X/kbAp/xUd5c3trktKZ8DZurN7d+VgOSB5CXnsfotNGMSR9D36S+NNU62bRsH5u+KKWuwoEt2sqA3G4MHBRFD1sd3spKf82lvAJPxf7nCtwVFZjm5kNikNhYotLSwOPBvTdoOjqbjeh+fbEPGOhPDoFEYe/XD0vQZ1VZ0siGz/ew+at9uFu8dM+KZ8QZvRgyMYPoOFtofyQVFpo4NHF0CmMM3traoOakEtzFxbj3BF6Xlh5oegCIisKWlYU9uxe27N7YemcHkkRv7L2zkaQkyprLWFe5rvWxsWojDo8DgER7IqNSRzEydWTrc2qs/2qsFk8LFY4KypvLqWgOPDsqKGsuo6K5onXb/mMFS7QlkhaXdkhiyYjL8CeY2HRSY1OxWY/hi8vng4pNULwMipdD8Vc0VNSx1XEGW5zfosrdD8HQs7eLzHHdScpNwml10OhupMnd5H92NR287G6i0XXw8v6HCVy0EBsVy6jUUYxOG92aLJKjD98HYIyhdFsdm74opWhVOW6nl+S0WIZOzmTIpJ4kdo85ZB9vY9NBzWHBz4gE1SIG+v++tvY/P4/LS9GqcjZ8vod92+uxRlkYOC6dEWdk0XNAstYuughNHJo4jpnP6aT+P/+h9rXXcG7ajK+x8aDt1h49sGX3wt5OYojKyECiDrRJ1znr2FC1gXUV61hfuZ51leuoaqkCwGaxMaz7MEamjmRk6khy03Lpk9jH/yXicUHZeti7Gvat94++scVCVDRExbR5PrDeWKNpFEOFr4VyTxPl7gbKXfVUuOopd1ZT3lJNhaOSiuaKdq8n6B7TvbWWElyLSY9NJyUmBafHSWNzBU3lG2is3ERTzXYa6/fQaNw0+xKxNk4ivm4SifU5AFQllVCUuopN3VbgsDcc8XMXxH8dgT2+9XqC/Y/9ywn2BLrHdCc3LZfB3QZjsxzbL3S308u2NeVs+qKUPVtqQaD3sO4Mm5xJTl4qUbbOuTq5urTJX7tYtg9ns4eUjDhGnJHF0EmZxCRo7aKr0cShiaPDXLt3U7NwIXWvv4G3thZ7Tg7xU6Zg752NrXdvbL2ysWf3whLffieqy+tic/Vm1lauZX3letZXrmdn/c7W7TnJOa21iNzUwBef1eb/xV61Ffasgj2rA8linf8aA4DYbmCNBo8DPE7wtLT7/qETfFEx1NhjqLDFUG63Ux5lo8JqodxqodxiqMBHOV6q8RzxouQor43+NaMYUjWezJohWIwVR0ItDX334O5fSUx360Ff+gclgaAkkWBLOKaLzDpDXYWDTctK2fzlPhqqW4iOi2JgfgbDJmceU1+D1+1j25pyNny+l71ba7FYhQFj0hhxRi+yBqdo7aIL08ShiSMkxuul8dPPqJk/n6YlS8BiIfHcc0mZMYPY8eOxWC3t/kf3GR8763f6axGB2sSmmk14fP5f8amxqYxKHUVuWi4jU0cyoscIEu2J/lFSdSX+JLF3dSBRFIAr8GvcngBZY/yPXuOg11hI7n3wxVvG+JOKpwXcLf7n/QnF4zw4wex/drdd116ZQ4/l9jRT5XNRblzUihDbvT9x6Xk4vJMpK+lFyUYHHpeP+JRoBo3PYPD4DFJ7J5yQX47GZ9izpYbCL0vZvroCj9tH96x4hk7KZPDEDOKTo4+4f21ZMxuW7GXTF6W0NLlJSotlxOlZDJ2cSVzSEfqDVJehieMEThwNjU3s3LMHfILFZ0V8FvBYEJ+AT8BnwXjA5zV4PT58Hv+z1+PD5/XhdRu8Xt8h27yB1z6vD4/Dhbu6FndtA14fmCg7xMThi7Lj84LX6wMD1igLsYk2bPEWXNEOGqw1VJh97PHspMZaicPWCDFu+mZkMyRrIKMy/M1OGXEZ/i/PpqoDCWJ/smgK3NrXaoeMkf7k0GscZI2F1EEhdxQfD8YYPC4fLoeHugoHRSvLKFpdjqPBTXRcFAPGpjN4fAaZg1KwWE68ZHE4ToeHopVlbPqylH3b6xGL0HdkD4ZNzqTvqB6tc2V5PT52fF3Jhs/3ULKpBrEI/UenMuKMXmQP7YacRJ/JqUATxwmWOFwODzvWVrL+q93sLazDYo7ty9Nr8eATL8bixWfxYfY/rD6w+LC73STUtRBX34zV58EZb6UxI5bm1FjEJkjrFP+CWIX6xgYa6prBEUWMO4E4dyJxniQsvvbji46BWLuTWEstcd5SYj2lxFpribPUE5sST2zPXsT2HkBszkii+45EbId2yHYmn8/gchxh1tQW/3PbmVT3l3U5PPh8B/7PWG0WcnJTGTQ+g74jemC1da0LDsOhZl8Tm74sZdOyfTTXuYhJsDF4QgZRdiuFX5TiqHeR0D2aEaf3YtiUzKPWTFTXpYnjBEgcbqeXnesqKVpZzq71VXg9PhzR9exMXcvEkUOwRUfjixK84sVn8eC1ePCIG5948YoHj8WNBzcecePG5X9tPK0Tze1/SHMLg5aXMnrpPtL3NtMSY2F1fgrLJiRRmmbF4/Pg9rkP2mf/xHRZCVmtI5xGpY5iaPehRFujcTc6aN6xAcfuTTj27Ka5rAxHvQOHLwmHL5lmycAhaTi8CbQ427+Ay2IVYhPtxCbaiEu0+18ntVlO9E8p7XX7jvjl7nS0/+XvbvEe9e9gi7YSHReFPTaK6Ngo7HFR2GOiiI4LLMf6X8cm2Mke2g177Kl5QZrP66O4sIbCL0rZsbYC4zX0HZXKiDOy6DOix0lV4zpVaeLooonD4/Kya0MVRSvL2bmuEo/LR1ySnazcBP7pnMs2WwF/qWkktyYwPl4sYIsHezzY4/zPBy0ngC2wfv/D5l/v3FdPzQcrqftoOb7mFqIH9afb9CtIvvgSLMk9Qr9bWGvndVBzU3DndVyPA01Nvcb5+ycS0g7s7vXhaHTjaHDjaHDRXO/C0eBqXXY0uGje/7rehccd2gV4/o9HAl/uVqLjbP7nWBv2uCiiY/xJIPjLf39y2P/aHmMN2+yyJ7OWJjc+r9G+i5OMJo4ulDi8bh+7C6spWlnGjq8rcTu9xCTYGDA2nUHj0onq5ebG966mvLmcv5TuIy91FIy6yt+h62oCdzO4GsHVHFhu8j+3Xfa0YLzQsCeGmq3xNFdEIxZDUh8H3QY2EdPDffAEofsTTiDRHJKYbDFQvePQzuvMPOg15kCy6MSZR/fflCc4qTga3UTZLIEv/6DkEGvFFm09ITuileqKInIHQBG5EPgT/nuOP2eMeajN9m7A88AAoAX4oTFmfWDbTqAB/DMr7w9eRLoDC4F++O85/l1jTE04z6MzeL0+SjbVULSyjO0FlbgcnsAwx3QGjcug15AULFYLlXtX8cM3bqbM6+AvDZD37adhxOUdvnewe98+ahcupObVV/FWVmHLyiD95nNJPmcCUXGWoETTGEhETQc/gpNTY0UgGTVDci8YPT1QmxgLqYPD2nktIthj/E1FyWmde08BpdSxCVviEBErMBc4DygBVojIO8aYjUHF7gYKjDGXicjQQPlzgrafZYypbHPo2cBiY8xDIjI7sHxXuM7jm/AFhjMWrSxn+5oKWprc2GOs5OSlMXBcOr2HdT9w5zZHDVUfP8CNe95lX1QUT2VdxJiz7/df5BYi4/PR9OWX1MyfT+NHH4MxJHzrW3S75mriTz+9y80Uq5Q6MYWzxjEBKDLGbAcQkQXANCA4cQwHfg9gjNkkIv1EJMMYU3aE404DpgZevwh8QhdKHMZnKN1Wy9aV5WwLDNOMiraSk5vKwHHp9BnR/eCrcL1uWPl3aj79PTd2s7PHHsNTZzxMfv8LQn5Pb10dtW++Se38Bbh27cLarRs9fvQjUqZPx57dKwxnqZQ6lYUzcfQCioOWS4CJbcp8DVwOLBGRCUBfIBsow3/X4EUiYoC/GGOeDeyTYYwpBTDGlIpIentvLiI3ATcB9OnTp3PO6DCMMZTtqGfryjK2rSqnqc5FlM1C31E9GDgug76jemBre0N5Y2DrIlj0a2qri7ixbw7FFph77tOMz2z7MbXPsX4DNfNfpv7f72FaWogdO5asWTNJvOCCgyaRU0qpzhTOxNFeD2XbnviHgD+JSAGwDlgD7J8waIoxZm8gMXwgIpuMMZ+F+uaBRPMs+DvHOxp8CMenYncDW1eWU7SqjMZqJ5Yooe+IHgzMT6ffqNTD3zegbAO8fzds/4S6HgP48bAJ7Gyp5IlznmDiUZKGr6WF+vf+Q838+bSsW4fExZE8bRrdrp5BzNChnX2aSil1iHAmjhKgd9ByNrA3uIAxph64AUD8Q2F2BB4YY/YGnstF5E38TV+fAWUikhmobWQC5WE8h4MYY6ja0xhIFuXUVziwWITew7sz8dL+5IxOI/pIY/obyuDjB2DNPyE6ibrzfsuPq5eyrXYbT5z9BKdlnXbYXV27dlGzYCG1b7yBr64O+4ABZPz61yRPuxRrYmIYzlYppdoXzsSxAhgkIjnAHmAGcE1wARFJAZqNMS7gRuAzY0y9iMQDFmNMQ+D1+cB9gd3eAa7HX1u5Hng7jOcAQPXeJrauKqNoZTm1Zc2IRcgeksK4C/vSPy+NmPijzOrpdsCyp+Dzx/xzHk28lfpJN3PLktkU1W7j8bMeZ0qvKYC/g9tTWoqzqCjw2IZz61Za1q+HqCgSzz2XbldfTdyE8TrsVCkVEWFLHMYYj4jMAt7HPxz3eWPMBhG5JbD9GWAY8A8R8eLvNP9RYPcM4M3AF2MU8LIx5r+BbQ8Br4jIj4DdwFXhOoeNS/fy9eJiqvc2gUCvQSmMPqc3A8akEZsYQh+CMbD+dfjwt1C3G4ZcDOffT2NiBrcuuonKnYXM7Xkjg98vYm/Rf3EW+e+a5gu6WY41LZXogQNJvf02Uq68Elt6u106Sil13OgFgEew8r2d7N5QxcD8dAaMTe/YnDvFK+D9X2KKV+CJH46z73U4G2Np2rKJrasX062smVjXgeL7E0T0wEH+u6UN8t81zZqS0uG4lVKqM+iV48eQOIwxITcHGWPw7N2L8+tlOBf9FefmQpyNsbgaovG1HMgQjYk2dvTwkJN3JgPzztIEoZTqsiJy5fiJrr2k0Zogtm3DuTXQD7FtG66iooObmJK6Ez1sFMmDhxI9YAAmJ5u7S55mWdN6Hj7zccb3O/94nopSSnUaTRxH4C4vx7lpkz9BbNvm74NomyBSU4nOiCe5XwPRcQ1Ejz2T6CvvxdpneGsZh8fBzMUzWdW0jj+c8QfO16ShlDqBaeI4gsonnqT21VeBA30QyZdf7u+LGDSQaGsp1i8ehPIvofckuPBB/0R/QVo8Ldz20W2sKlvFg6c/yIU5F0biVJRSqtNo4jiCbtddR/J3ph3aB1GxBT64B7b8F1L6wlUvwvBph8wI2+Jp4faPbmd56XIeOP0BLu5/8fE9AaWUCgNNHEcQM2TwwSuaq+GT38OKv/mnGT/vPphws3+68TacXid3fnIny0qXcf+U+7lkwCXHKWqllAovTRyh8Lhg+bPw2cPgbIBxN8BZd0N8arvFXV4XP/34pyzds5T7TruPaQOnHeeAlVIqfDRxHIkxsOld+OA3UL0dBp4L5/8O0ocddhe3183PP/k5n+/5nHsn38tlgy47jgErpVT4aeI4kn//DFY+D2lD4drXYdC5Ryzu9rn5+ac/55OST7hn0j1cOfjK4xSoUkodP5o4jmTE5ZAxAsb+AKxH/qjcPje/+PQXfFz8MXdPvJvvDvnu8YlRKaWOM00cR5Jzhv9xFB6fh9mfzebD3R9y1/i7uHro1cchOKWUigy9l+g35PF5uPvzu1m0axH/L///cd3w6yIdklJKhZUmjm/A6/PyqyW/4j87/8PPxv2M60dcH+mQlFIq7DRxHCOvz8s9S+/hvR3vccfYO7hh5A2RDkkppY4LTRzHwGd83PvFvfxr+7+YlTeLG0fdGOmQlFLquNHE0UE+4+O3X/6Wt7e9zU9G/4SbR98c6ZCUUuq40sTRAT7j4/5l9/PG1je4Ofdmbs27NdIhKaXUcaeJI0TGGB786kFe2/IaN466kZl5MyMdklJKRURYE4eIXCgim0WkSERmt7O9m4i8KSJrRWS5iIwMrO8tIh+LSKGIbBCRO4L2mSMie0SkIPD4n3CeA/iTxu+X/56Fmxdyw8gbuH3M7SHfGVAppU42YbsAUESswFzgPKAEWCEi7xhjNgYVuxsoMMZcJiJDA+XPATzAz40xq0UkEVglIh8E7ftHY8wj4Yo9mDGGh1c8zPxN87l++PX8dOxPNWkopU5p4axxTACKjDHbjTEuYAHQdprY4cBiAGPMJqCfiGQYY0qNMasD6xuAQqBXGGNtlzGGR1Y+wkuFL3HdsOv4ef7PNWkopU554ZxypBdQHLRcAkxsU+Zr4HJgiYhMAPoC2UDZ/gIi0g8YA3wVtN8sEfk+sBJ/zaSm7ZuLyE3ATQB9+vQ5phN4Ys0T/GPjP7hm6DX8YvwvNGkopY6oosHJq6uKeadgLwA9k2PomRRDRlIMmckxZASWeybFkBJnO2G/U8KZONr7REyb5YeAP4lIAbAOWIO/mcp/AJEE4HXgTmNMfWD108D9gWPdDzwK/PCQNzLmWeBZgPz8/LbvG5KxGWO5znOdJg2l1GH5fIYvtlXx8vJdLNpQhsdnmNCvO0mxNvbVO1i/p56qJiemzbdQdJSFjEAS8SeUaP/y/uSSHEN6Ygz2qK43himciaME6B20nA3sDS4QSAY3AIj/m3lH4IGI2PAnjXnGmDeC9gmujfwVeDdM8XN6r9M5vdfp4Tq8UuoEVtHg5LVVJSxYsZtdVc2kxNn4wWn9uHpiHwakJRxU1u31Ud7gZF9dC2X1LQee61sorWthbUkti+pacHp8h7xPaoK9TYI59HVSbNRx/XEbzsSxAhgkIjnAHmAGcE1wARFJAZoDfSA3Ap8ZY+oDSeRvQKEx5rE2+2QaY0oDi5cB68N4Dkop1crnM3y5vYqXv9rNoo37cHsNE3O687PzBnPBiJ7E2Kzt7mezWuiVEkuvlNjDHtsYQ53Dzb7gxFLnDCw72FvXwpriWqqbXIfsG2uz0jM5hoyk6EOSyvic7qQmRHfaZwBhTBzGGI+IzALeB6zA88aYDSJyS2D7M8Aw4B8i4gU2Aj8K7D4F+B6wLtCMBXC3MeY94GERycPfVLUT0Eu3lVJhVdkYqF0s383OQO3i+5P7cfWEPgxMTzj6AUIgIqTE2UmJszO0Z9Jhyzk9XsrrnW0STEvr8spdNZTXO3F5/bWXF384gW8NTuuUGFtjNW0b3k5C+fn5ZuXKlZEOQyl1AvH5DMu2VzFv+W4WbfDXLib06841E/tw4cjD1y66AmMM1U0u9tW30Kd7HIkxtmM6joisMsbkt12vN3JSSqkgVYHaxfxA7SI51sb3JvXjmom9GZieGOnwQiIi9EiIpkcnN1Htp4lDKXXKM+ZA38X7gdrF+H7duOPcQVw0MrNL1y4iQROHUuqUVdXo5PXVJcxfXsyOyiaSYqK4blJfrp7Qh8EZJ0btIhI0cSilTinGGJZtr+bl5bt5f/0+XF4f+X27MeusgVycq7WLUGjiUEqdEqqbXLwe6LvYXtlEYkwU10zsw9UT+jCkp9YuOkITh1LqpGWM4asd1bz81W7+G6hdjOvbjUfOGsjFozKJtWvt4lho4lBKfWPVTS721DiwRQl2qwV7lKX12RZ4jrLIcbu6uabJxeurS3h5+W62VxyoXcyY0PuI10io0GjiUEp1mDGGreWNfFhYxuLCclbvrjlkLqa2RPxXUEdbLdgCiWV/orFZLUQHJZnghGO3Bpe1BtbJQWWCk9OnWyr4zzp/7WJsnxT+78pcvp2bpbWLTqSJQykVEpfHx4qd1XxYWMaHhWUUVzsAGNkridvPHsTwrCS8PoPL4/M/vP5nd9Cz0+vD7TG4vN7AOtNu2Uanp3X9gf0PLns4idFRzJjQm6sn9GFYptYuwkETh1LqsGqbXXy8uZwPC8v5bHMFDU4P9igLUwb04OYzB3DOsHQykw8//1K4GGNwe83BSSnwnJkcq7WLMNPEoZQ6yLaKRhYXlvFhYTmrdtXg9RlSE6L5n1GZnDMsndMHpRJnj+xXh4hgj/I3V8WH5+JodQSaOJQ6xXm8PlbuquHDjWUs3lTOjsomAIb2TOTWbw3g3OEZ5PZKxmLRe9Iov6MmDhH5NvCeMebwjYpKqRNKncPNp1sqWFxYxiebK6hzuLFbLUwa0IMbpvTj7KHpZHeLi3SYqosKpcYxA/9d+l4H/m6MKQxzTEqpMNhV1cSHheUsLixj+Y5qPD5D93g75w7L4Nxh6ZwxOI2EaG2EUEd31H8lxpjrRCQJuBr4u4gY4O/AfGNMQ7gDVEodG6/PsHp3TeuQ2aLyRgAGZyTw4zP7c+6wdPJ6d8OqTVCqg0L6eRG4K9/rQCxwJ/477/2viPzZGPNEGONTSnVAQ4ubz7dW8mFhGR9vKqem2U2URZjYvzvXTuzDOUMz6NNDm6DUNxNKH8clwA+BAcA/gQnGmHIRiQMKAU0cSkVQcXUziwv9HdvLtlfh9hpS4mycNSSdc4alc+bgNJKO8UY+SrUnlBrHVcAfjTGfBa80xjSLyA/DE5ZSqi1jDCU1DjbsrWfj3jo2ltazYW89pXUtAPRPi+eHU3I4Z1gGY/ukEGW1RDhidbIKJXHcC5TuXxCRWCDDGLPTGLP4SDuKyIXAn/Dfc/w5Y8xDbbZ3A57HX5tpAX5ojFl/pH1FpDuwEOiH/57j3zXG1IRwHkqdMNxeH1vLGgPJoY6Ne+vZWFpPQ4sHAIvAgLQEJuZ0Z1R2CmcPTScnNT7CUatTRSiJ41XgtKBlb2Dd+CPtJCJWYC5wHlACrBCRd4wxG4OK3Q0UGGMuE5GhgfLnHGXf2cBiY8xDIjI7sHxXCOehVJfU0OKmsLThoFrE1rJGXF7/CPhYm5WhmYlMy8tieGYyI7KSGNIzUe8boSImlMQRZYxx7V8wxrhExB7CfhOAImPMdgARWQBMA4ITx3Dg94HjbhKRfiKSAfQ/wr7TgKmB/V8EPkEThzoBGGMob3AeVIPYsLeeXVXNrWV6xNsZnpXED0/PYXhWEsMzk8hJjdeRT6pLCSVxVIjIpcaYdwBEZBpQGcJ+vYDioOUSYGKbMl8DlwNLRGQC0BfIPsq+GcaYUgBjTKmIpLf35iJyE3ATQJ8+fUIIV6nO4/UZdlQ2HdzUtLeeqqbW32D06xHHiKwkrhqXzYisZIZnJZGeGH3cph5X6liFkjhuAeaJyJOA4P9C/34I+7X3r7/txMsP4b+4sABYB6wBPCHue0TGmGeBZwHy8/M7tK9SHdHi9rJpXwMb9waSRGk9m0obcLi9ANiswuCMRM4Zls7wzCRG9EpmaM9EEnWkkzpBhXIB4DZgkogkANKBi/5KgN5By9nA3jbHrgduABD/z6wdgUfcEfYtE5HMQG0jEygPMR6lOsX+u8q9sqKYdXvq2FbRiC/w0yQxJorhmUlcPaEPw7OSGJGVxIC0BOxROsJJnTxCugBQRC4GRgAx+6vRxpj7jrLbCmCQiOQAe/BPXXJNm+OmAM2BPpQbgc8CFxsead93gOvx11auB94O5RyU+qaMMXy2tZInP9rKip01dIuzMa5vNy4a2ZPhWf5O6+xusdrUpE56oVwA+Az+GsBZwHPAlcDyo+1njPGIyCzgffxDap83xmwQkVsC258BhgH/EBEv/o7vHx1p38ChHwJeEZEfAbvxX2eiVNj4fIYPC8t48uMi1pbUkZUcw33TRvDd/N46skmdksQc5X6PIrLWGJMb9JwAvGGMOf/4hPjN5efnm5UrV0Y6DHWC8foM760rZe7HRWza10Cf7nHMPGsAl43J1qYndUoQkVXGmPy260NpqmoJPDeLSBZQBeR0ZnBKdSVur4+3C/by1MdFbK9sYmB6An+cPppLcrP0amylCC1x/CvQF/F/wGr8o5v+Gs6glIoEp8fLqytLeObTbZTUOBiemcTT147lghE99SZGSgU5YuIQEQv+q7RrgddF5F0gxhhTdzyCU+p4cLi8vLx8N89+to2yeid5vVO4b9oIzhqSrh3dSrXjiInDGOMTkUeByYFlJ+A8HoEpFW4NLW7+uWwXf/t8B1VNLib1785j383jtAE9NGEodQShNFUtEpEr8HeI64V06oRX2+zi70t38velO6hv8fCtwWnMOnsg4/t1j3RoSp0QQkkcPwPiAY+ItOC/qtsYY5LCGplSnayy0clzn+/gn1/upMnl5fzhGcw6eyC52SmRDk2pE0ooV44nHo9AlAqX0joHz362nfnLd+Py+Lg4N4uZZw1gaE/97aPUsQjlAsAz21vf9sZOSnU1xdXNPP3pNl5bWYLXGC4b04ufTB1A/7SESIem1AktlKaq/w16HYN/uvRVwNlhiUipb2hbRSNPfbyNtwr2YBXhqvxsbvnWAHp313ttK9UZQmmquiR4WUR6Aw+HLSKljlFhaT1zPy7i3+tKiY6y8IPT+vHjM/rTMzkm0qEpdVIJaZLDNkqAkZ0diFLHqqC4lic/KuLDwjISoqO49VsD+OHpOaQmREc6NKVOSqH0cTzBgXthWIA8/DdgUiqilu+o5omPtvL51kqSY2389NzB/OC0fiTH6X0ulAqnUGocwbMDeoD5xpilYYpHqaNasrWSP3+0leU7qklNsDP7oqFcN6kvCdHHUoFWSnVUKP/TXgNajDFeABGxikicMab5KPsp1alKapr57b828sHGMnomxXDvJcOZMb4PsXad2lyp4ymUxLEYOBdoDCzHAouA08IVlFLBXB4ff/18O098tBVBmH3RUG6Y0o/oKE0YSkVCKIkjxhizP2lgjGkUER3XqI6LL4oqueft9WyraOLCET2555Lh9EqJjXRYSp3SQkkcTSIy1hizGkBExgGO8IalTnXlDS08+O9C3irYS5/ucfz9B+M5a2h6pMNSShFa4rgTeFVE9gaWM4HpYYtIndI8Xh8vLdvFo4u24PT4uP2cQfxk6gC9RatSXUgoFwCuEJGhwBD8ExxuMsa4Qzm4iFwI/An/fcOfM8Y81GZ7MvAS0CcQyyPGmL+LyBBgYVDR/sBvjDGPi8gc4MdARWDb3caY90KJR3Vta3bX8Ou31rNhbz1nDErlvmkjyUmNj3RYSqk2QrmOYyYwzxizPrDcTUSuNsY8dZT9rMBc4Dz8Fw2uEJF3jDEbg4rNBDYaYy4RkTRgs4jMM8Zsxn+9yP7j7AHeDNrvj8aYR0I+S9Wl1Ta7+MN/N7NgxW7SE6OZe81Y/mdUT70nhlJdVChNVT82xszdv2CMqRGRHwNHTBz457QqMsZsBxCRBcA0IDhxGCBR/N8QCUA1/mtFgp0DbDPG7AohVnUC8fkMr60u4aH/bKLO4eZHU3K487zBej2GUl1cKP9DLSIi+2/iFKgB2EPYrxdQHLRcAkxsU+ZJ4B1gL5AITDfG+NqUmQHMb7Nuloh8H//FiT83xtS0fXMRuQm4CaBPnz4hhKuOp8LSeu55az0rd9WQ37cb939nJMMydZpzpU4ElhDKvA+8IiLniMjZ+L/E/xvCfu21M7S9g+AFQAGQhb9p6kkRaf32EBE7cCnwatA+TwMDAuVLgUfbe3NjzLPGmHxjTH5aWloI4arjodHp4XfvbuTbTyxhe2UT/3dlLq/cPFmThlInkFBqHHfh/+V+K/5ksAj4awj7lQC9g5az8dcsgt0APBSozRSJyA5gKLA8sP0iYLUxpmz/DsGvReSvwLshxKIizBjDe+v2cd+7GyhvcDJjfB/uunAIKXGhVF6VUl1JKKOqfMAzgQcicjrwBP6O7SNZAQwSkRz8ndszgGvalNmNvw/jcxHJwD9ya3vQ9qtp00wlIpnGmNLA4mXA+qOdg4qsHZVN/Obt9Xy+tZIRWUk8fd04xvbpFumwlFLHKKReSBHJw/8lPh3YAbxxtH2MMR4RmYW/qcsKPG+M2SAitwS2PwPcD7wgIuvw12buMsZUBt4zDv+IrJvbHPrhQDwG2NnOdtVFtLi9PPVxEc98up3oKAtzLhnOdZP6EmUNpYVUKdVVHTZxiMhg/LWEq4Eq/NdViDHmrFAPHri+4r02654Jer0XOP8w+zYDPdpZ/71Q319FzsebyvnNO+sprnbwnbws7r54GOmJekMlpU4GR6pxbAI+By4xxhQBiMhPj0tU6oS1p9bBff/awPsbyhiQFs/LP57IaQNSIx2WUqoTHSlxXIG/xvGxiPwXWED7I6WUwu318bclO/jTh1sxGH5x4RBuPL0/9ihtllLqZHPYxGGMeRN4U0Tige8APwUyRORp4E1jzKLjE6Lq6pZtr+Ket9aztbyR84Zn8JtvD6d3d51AWamTVSijqpqAecA8EekOXAXMxj8sV53CKhqc/P69Qt5Ys4fsbrE89/18zh2eEemwlFJh1qG5HYwx1cBfAg91ivL6DC9/tYuH399Mi9vLrLMGMvOsgXonPqVOETopkOqQr4tr+fVb61m3p44pA3tw37SRDEhLiHRYSqnjSBOHConH6+N3/y7kxS93kpoQzZ+vHsMluZk6g61SpyBNHOqoXB4fdy5cw3vr9vH9yX35fxcMISnGFumwlFIRcqQLABs4dFJC8A/JNcYYnZXuFNDi9vKTeav5aFM593x7OD86PSfSISmlIuxIw3ETj2cgqutpdnm46R+rWLqtkgcuG8m1E/tGOiSlVBcQclOViKQDrXNGGGN2hyUi1SU0tLj54QsrWLWrhkevGs3lY7MjHZJSqos46mW9InKpiGzFP7nhp/gnFvxPmONSEVTb7OLa575ize5anrh6rCYNpdRBQpkP4n5gErDFGJODfxr0pWGNSkVMRYOTGc8uY9O+Bv7yvXFcnJsZ6ZCUUl1MKInDbYypwn8LWYsx5mP8d99TJ5nSOgfTn/2SXVXNPH/9eM4ZpleBK6UOFUofR62IJACf4Z92pBzwhDcsdbwVVzdzzXPLqGly848fTWB8v+6RDkl1QW63m5KSElpaWiIdiupEMTExZGdnY7OFNsw+lMQxDXDgn+TwWiAZuO+YI1RdzvaKRq597iuaXV7m3TiR0b1TIh2S6qJKSkpITEykX79+evHnScIYQ1VVFSUlJeTkhDbcPpSmqpuALGOMxxjzojHmz4GmK3US2Lyvge/+ZRkuj48FN03SpKGOqKWlhR49emjSOImICD169OhQLTKUxJEEvC8in4vIzMC9wdVJYF1JHdOf/RKrBRbePJlhmXpNpzo6TRonn47+TY+aOIwxvzXGjABmAlnApyLyYYjBXCgim0WkSERmt7M9WUT+JSJfi8gGEbkhaNtOEVknIgUisjJofXcR+UBEtgaeu4V0puogq3ZVc81flxFvj+KVmyczMF0nKlRKhaYjt2crB/bhv/94+tEKi4gVmAtcBAwHrhaR4W2KzQQ2GmNGA1OBR0XEHrT9LGNMnjEmP2jdbGCxMWYQsDiwrDrgi6JKvve35aQmRvPqLZPp2yM+0iEpFRKr1UpeXh4jR47kkksuoba2ttPfY+rUqaxcufLoBU9hoVwAeKuIfIL/SzoV+LExJjeEY08Aiowx240xLvy3np3WpowBEsVfT0oAqjn6iK1pwIuB1y/ivzuhCtHHm8u54YUVZHeLZeHNk8hKiY10SEqFLDY2loKCAtavX0/37t2ZO3dupEPC6/VGOoTjLpRRVX2BO40xBR08di+gOGi5BJjYpsyTwDvAXiARmG6M8QW2GWCRiBjgL8aYZwPrM4wxpQDGmNLAVCiHEJGb8Hfs06dPnw6GfnL67/pSbpu/hiE9E/nHDyfSPd5+9J2UOozf/msDG/fWd+oxh2clce8lI0IqO3nyZNauXQvAtm3bmDlzJhUVFcTFxfHXv/6VoUOHsm3bNq699lq8Xi8XXXQRjz32GI2NjXzyySc88sgjvPvuuwDMmjWL/Px8fvCDHxz0HrfeeisrVqzA4XBw5ZVX8tvf/haAfv368cMf/pBFixYxa9YsZsyY0XkfwgkglD6O2ceQNMA/i+4hh2uzfAFQgL/vJA94UkT299BOMcaMxd/UNVNEzuzImxtjnjXG5Btj8tPS0joU+Mno7YI9zHx5DaN6JTPvxkmaNNQJzev1snjxYi699FIAbrrpJp544glWrVrFI488wk9+8hMA7rjjDu644w5WrFhBVlZWh9/ngQceYOXKlaxdu5ZPP/20NVGB/9qHJUuWnHJJA8J7P44SoHfQcjb+mkWwG4CHjDEGKBKRHcBQYLkxZi+AMaZcRN7E3/T1GVAmIpmB2kYm/r4XdQQLlu/ml2+uY2JOd/52/Xjio/U2LOqbC7Vm0JkcDgd5eXns3LmTcePGcd5559HY2MgXX3zBVVdd1VrO6XQC8OWXX/LWW28BcM011/D//t//69D7vfLKKzz77LN4PB5KS0vZuHEjubn+lvrp06d3zkmdgDrSOd5RK4BBIpIT6PCegb9ZKthu/HNfERjmOwTYLiLxIpIYWB8PnA+sD+zzDnB94PX1wNthPIcT3t+X7mD2G+v41uA0XrhhgiYNdULb38exa9cuXC4Xc+fOxefzkZKSQkFBQeujsLDwiMeJiorC5/O1Lrd3DcOOHTt45JFHWLx4MWvXruXiiy8+qFx8/Kk7qCRsicMY4wFmAe8DhcArxpgNInKLiNwSKHY/cJqIrMPf+X6XMaYSyACWiMjXwHLg38aY/wb2eQg4LzBj73mBZdWOpz4p4rf/2sgFIzL4y/fGEWOzRjokpTpFcnIyf/7zn3nkkUeIjY0lJyeHV199FfBfCf31118DMGnSJF5//XUAFixY0Lp/37592bhxI06nk7q6OhYvXnzIe9TX1xMfH09ycjJlZWX85z86Kfh+Yf35aYx5D3ivzbpngl7vxV+baLvfdmD0YY5ZRaCWotpnjOGPH2zhzx8VMS0vi0evGk2UNZyVS6WOvzFjxjB69GgWLFjAvHnzuPXWW/nd736H2+1mxowZjB49mscff5zrrruORx99lIsvvpjk5GQAevfuzXe/+11yc3MZNGgQY8aMOeT4o0ePZsyYMYwYMYL+/fszZcqU432KXZb4uxdObvn5+eZUGZdtjOGBfxfy3JIdzBjfmwcuG4XVolf6qs5RWFjIsGHDIh1GyJqbm4mNjUVEWLBgAfPnz+ftt7V1uz3t/W1FZFWb6+iAMNc41PHl8xnueXs9877azQ9O68dvvj0ciyYNdQpbtWoVs2bNwhhDSkoKzz//fKRDOilo4jhJeLw+7np9Ha+vLuHWqQP4xQVDdE4hdco744wzWvs7VOfRxHEScHt93LmwgH+vLeXn5w1m1tkDNWkopcJGE8cJrsXtZdbLq/mwsJxfXzyMG8/oH+mQlFInOU0cJzCHy8tN/1zJ51sruf87I/nepL6RDkkpdQrQxHGCamhx86MXVrJyVzWPXDWaK8dlRzokpdQpQgf3n4Bqm11c97flrN5dw5+vHqNJQ51SHnjgAUaMGEFubi55eXl89dVXANx4441s3LixU94jIaHj96dZs2YNIsL777/fum7nzp28/PLLrcsFBQW899577e0esgcffPCg5dNOO+0bHe9YaOI4wVQ2Orn6r19RuLeeZ64bx7dzOz5xm1Inqi+//JJ3332X1atXs3btWj788EN69/ZPiffcc88xfHjbW/4cP/Pnz+f0009n/vz5reuOR+L44osvvtHxjoU2VZ1A9tW1cO1zy9hT6+BvP8jnjEE666+KoP/Mhn3rOveYPUfBRYefRai0tJTU1FSio6MBSE1Nbd02depUHnnkEfLz80lISGDmzJl8+OGHdOvWjQcffJBf/OIX7N69m8cff5xLL72UF154gTfffBOn08mOHTu45ppruPfeew95z//7v//jlVdewel0ctlll7VOrR7MGMNrr73GBx98wBlnnEFLSwsxMTHMnj2bwsJC8vLyuPrqq5k7dy4Oh4MlS5bwy1/+km9/+9vcdtttrFu3Do/Hw5w5c5g2bRovvPAC77zzDs3NzWzbto3LLruMhx9+mNmzZ7dO9DhixAjmzZtHQkICjY2NGGP4xS9+wX/+8x9EhF//+tdMnz6dTz75hDlz5pCamsr69esZN24cL7300jcaeak1jhNEcXUz3/3Ll+yra+HFGyZo0lCnpPPPP5/i4mIGDx7MT37yEz799NN2yzU1NTF16lRWrVpFYmIiv/71r/nggw948803+c1vftNabvny5cybN4+CggJeffXVQ+78t2jRIrZu3cry5cspKChg1apVfPbZZ4e839KlS8nJyWHAgAFMnTq1tVbx0EMPccYZZ1BQUMBdd93Ffffdx/Tp0ykoKGD69Ok88MADnH322axYsYKPP/6Y//3f/6WpqQnw104WLlzIunXrWLhwIcXFxTz00EOtEz3OmzfvoBjeeOMNCgoK+Prrr/nwww/53//9X0pLSwF/M9rjjz/Oxo0b2b59O0uXLj32PwJa4zgh7Khs4tq/LqPR6WHejyeR1zsl0iEpdcSaQbgkJCSwatUqPv/8cz7++GOmT5/OQw89dMgNmOx2OxdeeCEAo0aNIjo6GpvNxqhRo9i5c2drufPOO48ePXoAcPnll7NkyRLy8w/MsLFo0SIWLVrUOpdVY2MjW7du5cwzD7490Pz581vvyzFjxgz++c9/cvnllx/1fBYtWsQ777zDI488Avhn6d29ezcA55xzTuvcWsOHD2fXrl2tzXLtWbJkCVdffTVWq5WMjAy+9a1vsWLFCpKSkpgwYQLZ2f6+0P3T0p9++ulHje9wNHF0cQ0tbq5/fjktHh/zb5rEiKzkSIekVERZrVamTp3K1KlTGTVqFC+++OIhicNms7U2xVgsltamLYvFgsdz4O7UbZtr2i4bY/jlL3/JzTfffNh4vF4vr7/+Ou+88w4PPPAAxhiqqqpoaGg46rkYY3j99dcZMmTIQeu/+uqr1pj3n3Nw3Ic71uF09FhHo01VXdy9b2+gpKaZZ783TpOGOuVt3ryZrVu3ti4XFBTQt++xX7/0wQcfUF1djcPh4K233jpkBtwLLriA559/nsbGRgD27NlDefnB94778MMPGT16NMXFxezcuZNdu3ZxxRVX8NZbb5GYmHhQAmm7fMEFF/DEE0+0fumvWbPmqDHbbDbcbvch688880wWLlyI1+uloqKCzz77jAkTJoT+YXSAJo4u7O2CPbyxZg+3nT2I/H7dIx2OUhHX2NjI9ddfz/Dhw8nNzWXjxo3MmTPnmI93+umn873vfY+8vDyuuOKKg5qpwN+ncs011zB58mRGjRrFlVdeeUhNYv78+Vx22WUHrbviiit4+eWXyc3NJSoqitGjR/PHP/6Rs846i40bN5KXl8fChQu55557cLvd5ObmMnLkSO65556jxnzTTTeRm5vLtddee9D6yy67jNzcXEaPHs3ZZ5/Nww8/TM+ePY/xkzkynVa9iyqpaeaiP33OoPQEXrl5st5PQ3UJJ9q06kfywgsvsHLlSp588slIh9IldGRadf026oI8Xh8/XViAMfCnGWM0aSiluhTtHO+CnvpkGyt21vDH6aPp3T0u0uEodVL6wQ9+cEinugpNWH/KisiFIrJZRIpEZHY725NF5F8i8rWIbBCRGwLre4vIxyJSGFh/R9A+c0Rkj4gUBB7/E85zON5W767hT4u3Mi0vi8vG6FQiSqmuJ2w1DhGxAnOB84ASYIWIvGOMCZ5MZiaw0RhziYikAZtFZB7gAX5ujFktIonAKhH5IGjfPxpjHglX7JHS0OLmzgUF9EyK4f7vjIx0OEop1a5w1jgmAEXGmO3GGBewAJjWpowBEsU/eDoBqAY8xphSY8xqAGNMA1AI9ApjrF3Cve/4h97+aUYeSTG2SIejlFLtCmfi6AUUBy2XcOiX/5PAMGAvsA64wxjjCy4gIv2AMcBXQatnichaEXleRLq19+YicpOIrBSRlRUVFd/sTI6Dd77eyxur9zBLh94qpbq4cCaO9mbQajv29wKgAMgC8oAnRSSp9QAiCcDrwJ3GmPrA6qeBAYHypcCj7b25MeZZY0y+MSY/La1rz+tUUtPMr95cx5g+Kdx+9sBIh6NUl2W1Wlsn+Bs9ejSPPfYYPp/viPt0xoy06mDhTBwlQPDEKtn4axbBbgDeMH5FwA5gKICI2PAnjXnGmDf272CMKTPGeAM1k7/ibxI7YXl9hp8t/No/9Ha6Dr1V6kj2T/C3YcMGPvjgA9577712Z6sNpomj84VzOO4KYJCI5AB7gBnANW3K7AbOAT4XkQxgCLA90OfxN6DQGPNY8A4ikmmMKQ0sXgasD+M5hN1THxexfGc1j313NH166NBbdeL4w/I/sKl6U6cec2j3odw14a6Qyqanp/Pss88yfvx45syZg9Pp5NZbb2XlypVERUXx2GOPMWXKFH7zm98cNJX59OnTOzXmU1HYEocxxiMis4D3ASvwvDFmg4jcEtj+DHA/8IKIrMPftHWXMaZSRE4HvgesE5GCwCHvNsa8BzwsInn4m712AoeffayLW7O7hscXb+XS0VlcNuak7/tXqtP1798fn89HeXk5L730EgDr1q1j06ZNnH/++WzZsoX77rtPrxDvZGG9ADDwRf9em3XPBL3eC5zfzn5LaL+PBGPM9zo5zIhodHq4I2jo7Te5qYpSkRBqzSDc9k+btGTJEm677TYAhg4dSt++fdmyZUskQztp6ZXjEbJ/1tuFN08mOVaH3ip1LLZv347VaiU9Pf2I04qrzqU9sRHwr6/38vrqEmadNZDxOvRWqWNSUVHBLbfcwqxZsxARzjzzzNa74m3ZsoXdu3czZMiQQ6YyV9+cJo7jbE+tg7vfXEde7xRuO2dQpMNR6oQSfL/tc889l/PPP7/1PuE/+clP8Hq9jBo1iunTp/PCCy8QHR19yFTm6pvTpqrjyOsz/HRBAT6f4U8z8rDp0FulOsTr9R52W0xMDC+88MIh67t3786KFSvCGNWpRxPHcfTMp9tYvrOaR68aTd8e8ZEORymljon+5D1OCopr+eMHW/h2biaXj9Wht0qpE5cmjuPAP/R2DRlJMTxw2SgdequUOqFpU9VxMOedDRRXN7PgJh16q5Q68WmNI8zeXbuX11aVMPOsgUzI0aG3SqkTnyaOMNpT6+DuN/xDb2/XobdKqZOEJo4w8foMP11YgFeH3irVqcrKyrjmmmvo378/48aNY/Lkybz55psRieWFF15g1qxZEXnvSNJvszB55tNtLN9RzW+njdSht0p1EmMM3/nOdzjzzDPZvn07q1atYsGCBZSUlITtPT0eT9iOfaLSzvEw+Dow9Pbi3Eyu0KG36iS178EHcRZ27rTq0cOG0vPuuw+7/aOPPsJut3PLLbe0ruvbty+33XYbXq+X2bNn88knn+B0Opk5cyY333wzn3zyCXPmzCE1NZX169czbtw4XnrpJUSEVatW8bOf/YzGxkZSU1N54YUXyMzMZOrUqZx22mksXbqUSy+9lMGDB/O73/0Ol8tFjx49mDdvHhkZGZ167icSTRydrCkw9DY9MZoHv6NDb5XqTBs2bGDs2LHtbvvb3/5GcnIyK1aswOl0MmXKFM4/3z/59po1a9iwYQNZWVlMmTKFpUuXMnHiRG677Tbefvtt0tLSWLhwIb/61a94/vnnAaitreXTTz8FoKamhmXLliEiPPfcczz88MM8+mi7Nx89JWji6GS//dcGdlU3s+DHk0iO06G36uR1pJrB8TJz5kyWLFmC3W6nb9++rF27ltdeew2Auro6tm7dit1uZ8KECWRnZwOQl5fHzp07SUlJYf369Zx33nmAfzqTzMzM1mMH3/CppKSE6dOnU1paisvlIicn5zieZdejiaMTvbeulFdWljDzrAFM7N8j0uEoddIZMWIEr7/+euvy3LlzqaysJD8/nz59+vDEE09wwQUXHLTPJ598QnR0dOuy1WrF4/FgjGHEiBF8+eWX7b5XfPyBvsnbbruNn/3sZ1x66aWtTV+nMu0c7yR7ax3Mfn0to3uncOe5gyMdjlInpbPPPpuWlhaefvrp1nXNzc0AXHDBBTz99NO43W7AP7V6U1PTYY81ZMgQKioqWhOH2+1mw4YN7Zatq6ujVy9/f+WLL77YKedyItMaRyfYP/TW4zP8aboOvVUqXESEt956i5/+9Kc8/PDDpKWlER8fzx/+8Aeuuuoqdu7cydixYzHGkJaWxltvvXXYY9ntdl577TVuv/126urq8Hg83HnnnYwYMeKQsnPmzOGqq66iV69eTJo0iR07doTxLLs+Cedds0TkQuBP+O85/pwx5qE225OBl4A++JPYI8aYvx9pXxHpDiwE+uG/5/h3jTE1R4ojPz/frFy5svNOrI2nPini4f9u5uErc/lufu+wvY9SkVZYWMiwYcMiHYYKg/b+tiKyyhiT37Zs2H4ai4gVmAtcBAwHrhaR4W2KzQQ2GmNGA1OBR0XEfpR9ZwOLjTGDgMWB5Yj5uriWxxZt4eJRmVw1LjuSoSil1HERzjaVCUCRMWa7McYFLACmtSljgETxj1lNAKoBz1H2nQbsb2R8EfhOGM/hiJqcHu5cWOAfequz3iqlThHhTBy9gOKg5ZLAumBPAsOAvcA64A5jjO8o+2YYY0oBAs/p7b25iNwkIitFZGVFRcU3PZd23fevjeysauKx6Xk69FYpdcoIZ+Jo7+d32w6VC4ACIAvIA54UkaQQ9z0iY8yzxph8Y0x+WlpaR3YNyX/WlbJwZTG3fmsAk3TorVLqFBLOxFECBPcUZ+OvWQS7AXjD+BUBO4ChR9m3TEQyAQLP5WGI/Yj21jqY/cY6Rmcn89PzdOitUurUEs7EsQIYJCI5ImIHZgDvtCmzGzgHQEQygCHA9qPs+w5wfeD19cDbYTyHQ3h9hp+9UoDb6+PxGWN06K1S6pQTtm89Y4wHmAW8DxQCrxhjNojILSKyf4ay+4HTRGQd/hFSdxljKg+3b2Cfh4DzRGQrcF5g+bh59rPtLNtezZxLRpCTqrPeKhUJb775JiLCpk3tT7I4depU2huCHzwN+jPPPMM//vGP1vV79x5oELnxxhvZuHFjGCI/OYT1AkBjzHvAe23WPRP0ei9wfqj7BtZXEailHG9rS2p5dNFm/mdUT67K16G3SkXK/PnzOf3001mwYMExT/8RPMPuCy+8wMiRI8nKygLgueee64wwT1p65XiI/LPeFpCmQ2+VAuDzV7ZQWdzYqcdM7Z3AGd89cr9hY2MjS5cu5eOPP+bSSy9lzpw5OBwObrjhBjZu3MiwYcNwOByt5f/+97/z+9//nszMTAYPHtw6b9WcOXNISEigX79+rFy5kmuvvZbY2Fi+/PJLLrroIh555BFWrFjBjh07ePjhhwF/glm1ahVPPPEEL730En/+859xuVxMnDiRp556CqvV2qmfR1elDfQhuv/dwNDb7+aREmePdDhKnbLeeustLrzwQgYPHkz37t1ZvXo1Tz/9NHFxcaxdu5Zf/epXrFq1CoDS0lLuvfdeli5dygcffNBu89OVV15Jfn4+8+bNo6CggNjY2IO2vfHGG63LCxcuZPr06RQWFrJw4UKWLl1KQUEBVquVefPmhf/kuwitcYTgP+tKWbCimFunDmDyAB16qxRw1JpBuMyfP58777wTgBkzZjB//ny2bt3K7bffDkBubi65ubkAfPXVV0ydOpX9Q/KnT5/Oli1bQn6vtLQ0+vfvz7Jlyxg0aBCbN29mypQpzJ07l1WrVjF+/HgAHA4H6entXlJ2UtLEcRSldf6ht7nZyfxUZ71VKqKqqqr46KOPWL9+PSKC1+tFRBgzZsxhm4+/abPy9OnTeeWVVxg6dCiXXXYZIoIxhuuvv57f//733+jYJyptqjoCn8/ws4Vf4/L4+NOMMdij9ONSKpJee+01vv/977Nr1y527txJcXExOTk5jB07trWpaP369axduxaAiRMn8sknn1BVVYXb7ebVV19t97iJiYk0NDS0u+3yyy/nrbfeYv78+a03dzrnnHN47bXXKC/3X0ZWXV3Nrl27Ovt0uyytcRzBs59v58vtVfzhilE69FapLmD+/PnMnn3wvKZXXHEFa9asweFwkJubS15eHhMmTAAgMzOTOXPmMHnyZDIzMxk7dixer/eQ4/7gBz/glltuae0cD9atWzeGDx/Oxo0bW487fPhwfve733H++efj8/mw2WzMnTuXvn37hunMu5awTqveVRzrtOpvF+xhydZKHr4yV0dRKYVOq34y68i06lrjOIJpeb2Yltd2XkallDq1aaO9UkqpDtHEoZTqkFOheftU09G/qSYOpVTIYmJiqKqq0uRxEjHGUFVVRUxMTMj7aB+HUipk2dnZlJSUEK6bo6nIiImJITs79Pn3NHEopUJms9nIycmJdBgqwrSpSimlVIdo4lBKKdUhmjiUUkp1yClx5biIVADHOpFMKlDZieGc6PTzOEA/i4Pp53Gwk+Hz6GuMSWu78pRIHN+EiKxs75L7U5V+HgfoZ3Ew/TwOdjJ/HtpUpZRSqkM0cSillOoQTRxH92ykA+hi9PM4QD+Lg+nncbCT9vPQPg6llFIdojUOpZRSHaKJQymlVIdo4jgCEblQRDaLSJGIzD76HicnEektIh+LSKGIbBCROyIdU1cgIlYRWSMi70Y6lkgTkRQReU1ENgX+nUyOdEyRIiI/Dfw/WS8i80Uk9GlnTxCaOA5DRKzAXOAiYDhwtYgMj2xUEeMBfm6MGQZMAmaewp9FsDuAwkgH0UX8CfivMWYoMJpT9HMRkV7A7UC+MWYkYAVmRDaqzqeJ4/AmAEXGmO3GGBewAJgW4ZgiwhhTaoxZHXjdgP9L4ZS+p66IZAMXA89FOpZIE5Ek4EzgbwDGGJcxpjaiQUVWFBArIlFAHLA3wvF0Ok0ch9cLKA5aLuEU/7IEEJF+wBjgqwiHEmmPA78AfBGOoyvoD1QAfw803T0nIvGRDioSjDF7gEeA3UApUGeMWRTZqDqfJo7Dk3bWndJjl0UkAXgduNMYUx/peCJFRL4NlBtjVkU6li4iChgLPG2MGQM0Aadkn6CIdMPfMpEDZAHxInJdZKPqfJo4Dq8E6B20nM1JWOUMlYjY8CeNecaYNyIdT4RNAS4VkZ34mzDPFpGXIhtSRJUAJcaY/bXQ1/AnklPRucAOY0yFMcYNvAGcFuGYOp0mjsNbAQwSkRwRsePv4HonwjFFhIgI/vbrQmPMY5GOJ9KMMb80xmQbY/rh/3fxkTHmpPtVGSpjzD6gWESGBFadA2yMYEiRtBuYJCJxgf8353ASDhTQW8cehjHGIyKzgPfxj4x43hizIcJhRcoU4HvAOhEpCKy72xjzXuRCUl3MbcC8wI+s7cANEY4nIowxX4nIa8Bq/KMR13ASTj2iU44opZTqEG2qUkop1SGaOJRSSnWIJg6llFIdoolDKaVUh2jiUEop1SGaOJTq4kRkqs7Aq7oSTRxKKaU6RBOHUp1ERK4TkeUiUiAifwncr6NRRB4VkdUislhE0gJl80RkmYisFZE3A3McISIDReRDEfk6sM+AwOETgu53MS9wVbJSEaGJQ6lOICLDgOnAFGNMHuAFrgXigdXGmLHAp8C9gV3+AdxljMkF1gWtnwfMNcaMxj/HUWlg/RjgTvz3humP/2p+pSJCpxxRqnOcA4wDVgQqA7FAOf5p1xcGyrwEvCEiyUCKMebTwPoXgVdFJBHoZYx5E8AY0wIQON5yY0xJYLkA6AcsCftZKdUOTRxKdQ4BXjTG/PKglSL3tCl3pDl+jtT85Ax67UX/76oI0qYqpTrHYuBKEUkHEJHuItIX//+xKwNlrgGWGGPqgBoROSOw/nvAp4F7nJSIyHcCx4gWkbjjeRJKhUJ/tSjVCYwxG0Xk18AiEbEAbmAm/psajRCRVUAd/n4QgOuBZwKJIXg22e8BfxGR+wLHuOo4noZSIdHZcZUKIxFpNMYkRDoOpTqTNlUppZTqEK1xKKWU6hCtcSillOoQTRxKKaU6RBOHUkqpDtHEoZRSqkM0cSillOqQ/w+xMHOMD6qnsQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.lineplot(x='epoch', y='val Accuracy', data=simple_results, label='Regular')\n",
    "sns.lineplot(x='epoch', y='val Accuracy', data=simple_attn_results, label='Simple Attention')\n",
    "sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_dot, label='Dot')\n",
    "sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_gen, label='General')\n",
    "sns.lineplot(x='epoch', y='val Accuracy', data=attn_results_add, label='Additive')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:25:54.561109Z",
     "start_time": "2021-04-03T18:25:54.556649Z"
    }
   },
   "outputs": [],
   "source": [
    "class LargestDigitVariable(Dataset):\n",
    "    \"\"\"\n",
    "    Creates a modified version of a dataset where some variable number of samples are \n",
    "    taken, and the true label is the largest label sampled. When used with MNIST the\n",
    "    labels correspond to their values (e.g., digit \"6\" has label 6). Each datum will \n",
    "    be padded with 0 values if the maximum number of items was not sampled. \n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, dataset, maxToSample=6):\n",
    "        \"\"\"\n",
    "        dataset: the dataset to sample from\n",
    "        toSample: the number of items from the dataset to sample\n",
    "        \"\"\"\n",
    "        self.dataset = dataset\n",
    "        self.maxToSample = maxToSample\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.dataset)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        \n",
    "        #NEW: how many items should we select?\n",
    "        how_many = np.random.randint(1,self.maxToSample, size=1)[0]\n",
    "        #Randomly select n=self.toSample items from the dataset\n",
    "        selected = np.random.randint(0,len(self.dataset), size=how_many)\n",
    "        \n",
    "        #Stack the n items of shape (B, *) shape into (B, n, *)\n",
    "        #NEW: pad with zero values up to the max size\n",
    "        x_new = torch.stack([self.dataset[i][0] for i in selected] + \n",
    "                            [torch.zeros((1,28,28)) for i in range(self.maxToSample-how_many)])\n",
    "        #Label is the maximum label\n",
    "        y_new = max([self.dataset[i][1] for i in selected])\n",
    "        #Return (data, label) pair\n",
    "        return x_new, y_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:25:54.567235Z",
     "start_time": "2021-04-03T18:25:54.562367Z"
    }
   },
   "outputs": [],
   "source": [
    "largestV_train = LargestDigitVariable(mnist_train)\n",
    "largestV_test = LargestDigitVariable(mnist_test)\n",
    "\n",
    "trainV_loader = DataLoader(largest_train, batch_size=B, shuffle=True)\n",
    "testV_loader = DataLoader(largest_test, batch_size=B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-04-03T18:25:59.501012Z",
     "start_time": "2021-04-03T18:25:54.568449Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variable Length Accuracy:  0.967\n"
     ]
    }
   ],
   "source": [
    "attn_dot = attn_dot.eval()\n",
    "\n",
    "preds = []\n",
    "truths = []\n",
    "with torch.no_grad():\n",
    "    for inputs, labels in testV_loader:\n",
    "        pred = attn_dot(inputs.to(device))\n",
    "        pred = torch.argmax(pred, dim=1).cpu().numpy()\n",
    "        \n",
    "        preds.extend(pred.ravel())\n",
    "        truths.extend(labels.numpy().ravel())\n",
    "print(\"Variable Length Accuracy: \", accuracy_score(preds, truths))"
   ]
  }
 ],
 "metadata": {
  "author": "BLUE About Validation Loss?",
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "latex_metadata": {
   "title": "Attention Mechanisms"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
